Я работаю над парсером для языка LiveScript, и у меня возникают проблемы с разбором форм определения свойств объекта - key: value
и (+|-)key
- вместе. Например:Избегание левой рекурсии при разборе определения объектов LiveScript
prop: "val"
+boolProp
-boolProp
prop2: val2
У меня есть key: value
форма работы с этим:
Expression ::= TestExpression
| ParenExpression
| OpExpression
| ObjDefExpression
| PropDefExpression
| LiteralExpression
| ReferenceExpression
PropDefExpression ::= Expression COLON Expression
ObjDefExpression ::= PropDefExpression (NEWLINE PropDefExpression)*
// ... other expressions
Но тем не менее я пытаюсь добавить ("+"|"-") IDENTIFIER
к PropDefExpression
или ObjDefExpression
, я получаю сообщения об ошибках, используя левую рекурсию. Каков (правильный) способ сделать это?
Что парсер-генератор вы используете (и, если вы заботитесь чтобы комментировать, почему вы выбрали тот, а не тот, который создает анализатор снизу вверх)? – rici
Я работаю над плагином LiveScript для IDE IntelliJ IDEA и в соответствии с их [учебником] (https://confluence.jetbrains.com/display/IntelliJIDEA/Grammar+and+Parser) Я использую [JFlex lexer] (http://jflex.de/) + [GrammarKit parser plugin] (https://github.com/JetBrains/Grammar-Kit). И я слишком мало знаю о парсерах и разработке плагинов IntelliJ в целом, чтобы искать альтернативы. –
Справедливо. По-видимому, GrammarKit строит рекурсивную грамматику спуска, хотя ее документация немного дезорганизована, поэтому я могу что-то упустить. Я также не очень разбираюсь в сценариях lifecript, но это не похоже на синтаксический анализ LL (1), и его синтаксический анализатор построен с помощью Jison, который строит парные анализаторы LALR (1) снизу вверх. (Https://github.com/gkz/LiveScript/blob/master/src/grammar.ls). Короче говоря, я не думаю, что могу вам помочь. Сожалею. – rici