Моя первоначальная проблема состояла в том, чтобы выяснить, можно ли проанализировать следующую контекстно-свободную грамматику: grammar_part_1 ; grammar_part_2 ( примеров ) и, если нет, отредактируйте грамматику так, чтобы она была.
Я искал две вещи: левую рекурсию и неоднозначность.К сожалению, я не смог найти ни одной из этих проблем, за исключением случая, когда вы выбираете идентификатор, похожий на символ терминала, который не разрешен по определению.
Теперь есть три решения этой проблемы.проблема:
- Грамматика может быть проанализирована парсером рекурсивного спуска без обратного отслеживания.
- Задача парсера - подчиняться определению (например, данное правило "нет аналогичного терминального символа-и identif names "), где расширение правила identif с символом терминала идентификации решит проблему.
- Существует и другой вид грамматической проблемы, помимо упомянутых.что может произойти с этими синтаксическими анализаторами, о которых я не задумывался.
Предполагая, что моя третья идея верна, какими будут эти методы и, если нет, существуют ли другие методы, чтобы выяснить,грамматика разбирается парсером рекурсивного спуска без возврата назад?Является ли предположение 2 верным?
---------------- РЕДАКТИРОВАТЬ --------------------
Грамматика:
Prog -> Def^+
Def -> DEF Left == Expr
Left -> MAIN : Type
| Ident ([Ident:Type(, Ident:Type)^*]):Type
Type -> NAT
| BOOL
Expr -> Num
| TRUE
| FALSE
| Ident[([(Expr(, Expr)^*)])]
| IF Expr THEN Expr [ELSE Expr] FI
Ident -> (a|...|z)^+
Num -> (0|...|9)^+
символов в заглавных буквах (плюс '==', ':', справа от Идентификатор и Num )являются терминалами;(), [], ^ + и ^ * являются операторами обозначений.Отдых нетерминал