首页 > 解决方案 > 将 BNF 文法转换为 JavaCC

问题描述

我使用 BNF 语法编写了以下 JavaCC 代码:

TOKEN: {
  <NEXPR: <NTERM> ((<ADD> | <SUB>) <NTERM>)*> |
  <NTERM: <NFACTOR> ((<MUL> | <DIV>) <NFACTOR>)*> |
  <NFACTOR: (<SUB>)? (<DIGIT> | <REPCOUNT> | <PARAMETER> | <LPAR> <NEXPR> <RPAR>)>
}

我从 javacc 收到一个错误:

检测到正则表达式中的循环:“...NEXPR...--> ...NTERM...--> ...NFACTOR...--> ...NEXPR...”

我认为我的语法不是左递归,无论如何,我读到 JavaCC 不支持左递归语法,所以我需要将该代码转换为右递归。现在我知道了以下原理:
这个语法(左递归)

X -> Xa | b

变为(右递归):

X -> bX'
X' -> aX' | {}

或(适应 JavaCC 情况)

X -> b(a)*

但我不知道如何转换我的示例,因为它是由三个规则组成的。你能帮我吗?初始语法(BNF 形式):

NExpr      = NTerm { ( "+" | "-" )  NTerm }

NTerm      = NFactor { ( "*" | "/" ) NFactor }

NFactor    = "-" ( Number | REPCOUNT | Parameter | "(" NExpr ")" ) | 
                   Number | REPCOUNT | Parameter | "(" NExpr ")"

标签: grammarbnfjavacc

解决方案


推荐阅读