antlr 연산자 우선 순위
-
12-09-2019 - |
문제
연산자 우선 순위는 Antlr에서 어떻게 구현됩니까?
현재 Xtext/Antlr 패키지를 사용하고 있습니다.
편집하다:
나는 Sepp2k가 제안한 일을했고, 이제 운영자 우선 순위가 작동하지만 3 +*와 같은 것들도 지금 작동합니다. 연산자는 기본적으로 나무를 통해 "떨어지는"것입니다.
또한 Antlr의 웹 사이트에서 C 문법을 시도했으며 Antlrworks에서도 같은 일이 발생했습니다.
누구든지 문제가 무엇인지 아는 사람이 있습니까?
BinaryExpression:
'or'? AndOp; //or op
AndOp:
'and'? ComparisonOp;
ComparisonOp:
('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;
ConcatOp:
'..'? AddSubOp;
AddSubOp:
('+' | '-')? MultDivOp;
MultDivOp:
('*' | '/')? ExpOp;
ExpOp:
'^'? expr=Expression;
해결책
antlr을 사용하면 문법 규칙에서 우선 순위를 인코딩합니다. 처럼:
expr: mult ('+' mult)* ;
mult: atom ('*' atom)* ;
atom: INT | '(' expr ')' ;
이것은 "1 + 2 * 3 + (4 * 5 + 6)"as "(1 + (2 * 3)) + ((4 * 5) + 6)"을 구문 분석합니다.
다른 팁
xtext를 사용하므로 xtext의 동작 개념을 사용하는 것이 좋습니다. 즉, 간단한 표현 문법은 일반적으로 이것과 유사하게 보입니다.
Sum: Product ({Sum.left=current} operator=('+'|'-') right=Product)*;
Product: Atom ({Product.left=current} operator=('+'|'-') right=Atom)*;
Atom: Number | Paren;
Paren: '(' Sum ')';
Number: value=INT;
봐주세요 문서 자세한 내용은.
제휴하지 않습니다 StackOverflow