1

我正在使用 JFlex 和 Grammar Kit 为 Elm 语言开发一个 Intellij 插件。我编写解析器的经验很少。

我无法解析 case 表达式,因为它们与函数调用发生冲突。

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)我可以用更好的 BNF 解决这个问题吗?
2)涉及到什么样的解析概念。
3) 你能否指出另一个解析器(如 yacc)如何处理这个问题。

4

0 回答 0