문제

지금 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은 더하기, 빼기, 멀티 및 div가 서로 recursive가되기 때문에 오류가 발생합니다.
나는 그것을 고치는 방법을 모른다.
(나는이 문법 "표현"이 무한하게 반복 될 수 있기 때문에 이것이 발생한다는 것을 알고 있습니다. 나는 다른 문법과 함께이 문제가 있었지만, 내 자신의 내 자신에게 그것을 고칠 수 있습니다.

내 솔루션은 다음과 같은 방식으로 문법을 제한하는 것입니다

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