Парсер LALR vs LL
Я использовал lex / yacc, и теперь я пытаюсь переключиться на ANTLR. Основная проблема заключается в том, что ANTLR является парсером LL(*) в отличие от yacc, который является LALR. Я привык думать снизу вверх, и я точно не знаю, в чем преимущество ll grammars. Люди говорят, что ll грамматики легче понять и более популярны в эти дни. Но кажется, что Парсеры LR более мощные, например, Парсеры LL неспособны иметь дело с левыми рекурсиями, хотя, похоже, есть некоторые обходные пути.
Итак, вопрос в том, в чем преимущество грамматик LL над lalr? Я был бы признателен, если бы кто-нибудь дал мне несколько примеров. Ссылки на полезные статьи тоже были бы замечательными.
Спасибо за вашу помощь заранее!
(Я вижу, что это отличный ресурс:Какие преимущества имеют Парсеры LL по сравнению с парсерами LR?, но было бы лучше с некоторыми примерами.)
2 ответов
самое большое преимущество, которое я вижу для парсеров LL, заключается в том, что их так легко понять и реализовать! Вы можете написать от руки рекурсивного спуска Парсеры с кодом, который соответствует грамматике.
LR обычно считаются более мощными, а также намного быстрее, но есть несколько компромиссов, которые я знаю:
- синтаксические анализаторы LR могут использовать только синтезированные атрибуты; они не могут передавать унаследованные атрибуты.
- действия в грамматике LR могут причина грамматики недетерминизма, но не в LL.
однако вы обнаружите, что LL(*) также очень мощные.
Парсеры LR строго более мощные, чем Парсеры LL, и, кроме того, Парсеры LALR могут работать в O(n), как Парсеры LL. Так вы не найдете никакие функциональные преимущества LL над LR.
таким образом, единственным преимуществом ll является то, что государственные машины LR довольно сложны и трудны для понимания, а сами Парсеры LR не особенно интуитивны. С другой стороны, код парсера LL, который автоматически генерируется, может быть очень легко понять и отладить.