質問

私は今AntLR4にかなり問題があります。
このRPN文法

でANTLRをフィードしようとするときはいつでも
 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式ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top