Size: a a a

Compiler Development

2021 May 24

h

hazer_hazer in Compiler Development
Ладно. Видимо я в терминах не силен, но, если это возможно только в LR, то каким образом у всех это в ANTLR используется?
источник

K

Kir in Compiler Development
ANLTR преобразует грамматику
источник

K

Kir in Compiler Development
Возможно, скрытым для пользователя образом
источник

K

Kir in Compiler Development
Не преобразует только "пакрат с левой рекурсией", но там, по сути, происходит LR при обнаружении левой рекурсии
источник

h

hazer_hazer in Compiler Development
всё равно не уверен, что left-corner это имено LR фича. В этом случае мы просто поднимаем lhs и парсим rhs только если нашли нужный infix
Нам всё равно на то, какого типа структура поднялась снизу — это выражение 100% (если нет ошибок). В то время как в LR нам важно что именно поднялось
источник

K

Kir in Compiler Development
Вот не уверен, что нам всё равно
источник

DP

Dmitry Popov in Compiler Development
Но парсер-комбинаторы это не LL(1). С левой рекурсией у них часто проблема, но легко обходится переформулированием грамматики, язык тот же самый в результате парсится без потери мощности. Зато там, где у LR(1) сплошные reduce-reduce конфликты, комбинаторы за счет left-biased choice решают элементарно. Плюс, они умеют в контекстно-зависимость.
Пример из моей практики:
f(a,b,c,d)  // this is a function call
f(a,b,c,d) = a+b*c-d  // this is a function definition
На LALR(1) я не смог такое парсить, на комбинаторах в легкую.
источник

h

hazer_hazer in Compiler Development
ну тут вы правы в некоторым смысле.
но для япов в указателями, lhs действительно не имеет значения, так как любое выражение можем быть lhs, даже в случае присваивания (*a = b)
источник

K

Kir in Compiler Development
> но легко обходится переформулированием грамматики

Руками, обычно. LR, зато, обнаруживает конфликты, вместо того, что втихую из запрятать. Ну и да, если добавить в LR приоритеты, то они тоже смогут разрешить f (x, y) и f (x, y) = ...
источник

K

Kir in Compiler Development
А, стоп, это ж разные структуры
источник

K

Kir in Compiler Development
Не, ну так-то да. С роллбэками, зато. И LR заставит сделать бесконфликтную грамматику
источник

K

Kir in Compiler Development
Мне вот нравятся грамматики без конфликтов
источник

DP

Dmitry Popov in Compiler Development
А регекспы заставят делать еще проще грамматику, без конфликтов для них. :)
источник

DP

Dmitry Popov in Compiler Development
Мне просто казалось, что множество языков, которое LR(1) может осилить, меньше, чем то, что можно с комбинаторами.
источник

K

Kir in Compiler Development
И без рекурсии в правилах.
источник

DP

Dmitry Popov in Compiler Development
Пусть комбинаторы и не такие быстрые обычно, это уже отдельный вопрос.
источник

K

Kir in Compiler Development
Комбинаторы - это LL(inf) c left-biased choice. Я как-то видел парсер, который в силу своей LL-овости парсил кусок LR-грамматики за O(exp(N)), и починил я это рекурсивным подъёмом вручную
источник

K

Kir in Compiler Development
А вот у LR есть гарантия работы за O(N)
источник

DP

Dmitry Popov in Compiler Development
Ну я о том, что эта гарантия достается за счет сужения класса доступных языков. Также как гарантии регекспов заставляют еще больше сузить.
источник

DP

Dmitry Popov in Compiler Development
Причем пакрат формально тоже О(N).
источник