문제

연산자 우선 순위는 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;

봐주세요 문서 자세한 내용은.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top