2016-09-13 5 views
0

Я определяю свои собственные грамматики, используя antlr 4, и хочу построить дерево true В соответствии с приоритетом операций (+ * - /) ....Как сделать приоритет операций (+ * - /) в моих грамматиках?

Я нахожу образец на примере приоритета операций (* +) хорошо ...

Я пытаюсь изменить его, чтобы добавить приоритет операций (- /), но я не смог :(

грамматик для приоритета операций (+ *) является:

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

это работа как вы сказали, спасибо вам большое @Bart Kiers – code

0

Вы обычно решить эту проблему, определив выражения, термина и фактора правила производства. Вот грамматика (указанная в EBNF), который реализует унарные + и Унарный - вместе с 4-х двоичными арифметическими операторами, плюс скобками:

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

, где number является числовым литералом.

 Смежные вопросы

  • Нет связанных вопросов^_^