Преобразование грамматики BNF в JavaCC - PullRequest
0 голосов
/ 24 мая 2018

Я написал следующий код 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 ")"
...