Antlr4 문법은 재귀 오류를 남겼습니다
문제
지금 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 표현식이 아닙니다. 두 개의 숫자로 시작해야합니다.
제휴하지 않습니다 StackOverflow