2016-09-13 3 views
0

나는 antlr 4를 사용하여 내 자신의 문법을 정의하고 트리를 사실대로 만들고 싶다. 우선 순위에 따라 (+ * - /) ....내 문법에서 작업 우선 순위 (+ * - /)를 수행하는 방법?

나는 우선 순위가있는 작업 잘 ...

나는 그것이 작업의 우선 순위 추가 편집하려고 (- /)를하지만 운영 (+ *)의 우선 순위에 대한 :(

문법을 실패한 것은 :

println:PRINTLN expression SEMICOLON {System.out.println($expression.value);}; 
expression returns [Object value]: 
    t1=factor {$value=(int)$t1.value;} 
    (PLUS t2=factor{$value=(int)$value+(int)$t2.value;})*; 

    factor returns [Object value]: t1=term {$value=(int)$t1.value;} 
    (MULT t2=term{$value=(int)$value*(int)$t2.value;})*; 

term returns [Object value]: 
    NUMBER {$value=Integer.parseInt($NUMBER.text);} 
    | ID {$value=symbolTable.get($value=$ID.text);} 
    | PAR_OPEN expression {$value=$expression.value;} PAR_CLOSE 
    ; 
MULT :'*'; 
PLUS :'+'; 

MINUS:'-'; 
DIV:'/' ; 

운영 우선 순위 (- /)를 어떻게 추가 할 수 있습니까?

답변

0
*/이 같은 +-보다 더 높은 우선 순위를 부여 할 수 ANTLR3 (및 ANTLR4)에서

는 :

println 
: PRINTLN expression SEMICOLON 
; 

expression 
: factor (PLUS factor 
      | MINUS factor 
     )* 
; 

factor 
: term (MULT term 
     | DIV term 
     )* 
; 

term 
: NUMBER 
| ID 
| PAR_OPEN expression PAR_CLOSE 
; 

그러나 ANTLR4에서

,이 또한 작동합니다

println 
: PRINTLN expression SEMICOLON 
; 

expression 
: NUMBER 
| ID 
| PAR_OPEN expression PAR_CLOSE 
| expression (MULT | DIV) expression // higher precedence 
| expression (PLUS | MINUS) expression // lower precedence 
; 
+0

그 작업 당신이 말했듯이 verey 많은 바트 키어스 감사합니다. – code

0

당신은 일반적으로 표현, 용어요인 생성 규칙을 정의하여이 문제를 해결. 다음은 단항 + 및 단항을 구현 (EBNF에 지정된) 문법이다 -, 4 이진 산술 연산자, 플러스 괄호와 함께 :

start ::= expression 
expression ::= term (('+' term) | ('-' term))* 
term ::= factor (('*' factor) | ('/' factor))* 
factor :: = (number | group | '-' factor | '+' factor) 
group ::= '(' expression ')' 

number는 숫자 문자입니다.

는 는