AntLR4文法は再帰的な誤りを残しました
質問
私は今AntLR4にかなり問題があります。
このRPN文法
grammar UPN;
//Parser
expression : plus | minus | mult | div | NUMBER;
plus : expression expression '+';
minus : expression expression '-';
mult : expression expression '*';
div : expression expression '/';
//Lexer
NUMBER : '-'? ('0'..'9')+;
.
AntLRは、プラス、マイナス、MULT、DIVが互いに再帰的に残っているため、エラーをスローします。
その修復方法がわからない。
(この文法「表現」が無限にループされる可能性があるため、私は他の文法とこの問題を抱えていましたが、私は自分のものを修正することができました。
私の唯一の解決策は、次の方法で文法を制限することです
grammar UPN;
//Parser
expression : plus | minus | mult | div | NUMBER;
exp2 : plus2 | minus2 | mult2 | div2 | NUMBER;
plus : exp2 exp2'+';
minus : exp2 exp2'-';
mult: exp2 exp2'*';
div: exp2 exp2'/';
plus2 : NUMBER NUMBER '+';
minus2 : NUMBER NUMBER '-';
mult2: NUMBER NUMBER '*';
div2: NUMBER NUMBER '/';
//Lexer
NUMBER : '-'? ('0'..'9')+;
.
しかし、これは私がそれを望んでいることは実際にはありません、私は
のような表現で最大で働くことができるからです。2 3 + 5 4 - *
.
と文法は実際にはより複雑になるでしょう。
あなたがみんな私を助けることができることを願っています
解決
AntLR4は、「直接」左の再帰的ルールをサポートしています。
このようなものを試してみてください:
grammar RPN;
parse : expression EOF;
expression
: expression expression '+'
| expression expression '-'
| expression expression '*'
| expression expression '/'
| NUMBER
;
NUMBER : '-'? ('0'..'9')+;
SPACES : [ \t\r\n] -> skip;
.
BTW、23+54-*
は有効なRPN式ではありません。
所属していません StackOverflow