Я написал следующий код JavaCC из грамматики BNF:
TOKEN: {
<NEXPR: <NTERM> ((<ADD> | <SUB>) <NTERM>)*> |
<NTERM: <NFACTOR> ((<MUL> | <DIV>) <NFACTOR>)*> |
<NFACTOR: (<SUB>)? (<DIGIT> | <REPCOUNT> | <PARAMETER> | <LPAR> <NEXPR> <RPAR>)>
}
Я получаю сообщение об ошибке из javacc:
Обнаружен цикл в регулярном выражении: "... NEXPR... -> ... NTERM ... -> ... NFACTOR ... -> ... NEXPR ... "
Я думаю, что моя грамматика не осталасьВ любом случае, - recursion, я читал, что 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 ")"