Разбор выражений в регистре Elm конфликтует с вызовом функции

Я разрабатываю плагин Intellij для языка Elm, используя JFlex и Grammar Kit. У меня минимальный опыт написания парсеров.

Я не могу разобрать выражения регистра, потому что они конфликтуют с вызовами функций.

Спецификация BNF выглядит следующим образом:

expr ::=
  NUM
  | IDENTIFIER
  | FunctionCallExpr
  | CaseExpr


CaseExpr ::= CASE IDENTIFIER OF case_body
case_body ::= (case_body_part)* OTHERWISE "->" expr
case_body_part ::= NUM "->" expr

FunctionCallExpr ::= IDENTIFIER NUM

В следующем примере синтаксический анализатор не распознает, что 84 является началом нового case_body_part

 case n of
    42 -> foo 420
    84 -> bar 840   -- this line is treated as an error rather than case_body_part
    otherwise -> zap 100

Если кто-нибудь знает комплект грамматики, я был бы признателен за рулевого управления. Однако, исходя из предположения, что зрители более склонны знать парсеры в целом:
1) Могу ли я исправить это с лучшей БНФ.
2) Какие виды синтаксического анализа участвуют.
3) Можете ли вы указать мне, как это обрабатывает другой парсер, например, yacc.

0 ответов

Другие вопросы по тегам