2014-11-07 4 views
1

기본 arithmetics에 대한 언어를 작성하려면 Antlr4을 배우고 있습니다. 현재 기본 산술 연산자 *+-/에 대해 Antlr4이라는 문법을 작성했습니다. op=('-'|'+') expr :기본 산술 및 부호 식을 사용하는 Antlr4 문법

grammar Expr; // rename to distinguish from Expr.g4 

prog: stat (';' stat)* ; 

stat: ID '=' expr (';'|',')?    # assign 
    | expr (';')?       # printExpr 
    ; 

expr: op=('-'|'+') expr     # signed 
    | expr op=('*'|'/') expr    # MulDiv 
    | expr op=('+'|'-') expr    # AddSub 
    | ID         # id     
    | DOUBLE        # Double 
    | '(' expr ')'       # parens 
    ; 



MUL : '*' ; // assigns token name to '*' used above in grammar 
DIV : '/' ; 
ADD : '+' ; 
SUB : '-' ; 
ID : [a-zA-Z]+ [0-9]* ;  // match identifiers 
DOUBLE : [0-9]+ ('.' [0-9]+)? ; 
WS : [ \t\r\n]+ -> skip ; 

문제는 내 문법으로 인해 규칙에 2++++3 같은 입력을 수용한다는 것입니다 : 여기 내 문법이다. 그러나 -2 + 3, x = 6; y = -x, +3 -2과 같이 서명 된 표현식을 구현하는 다른 방법을 찾지 못했습니다.

어떻게 버그를 해결할 수 있습니까?

답변

1

이제 문법을 해보십시오. 괴물 규칙 (expr)이됩니다. 전체 식에 서명하는 것이 아니라 단일 값에 서명하는 것이 좋습니다. 어떻게 이런 일이

expr: add value 
    | expr mult expr 
    | expr add expr 
    | value 
    ; 
value: ID 
    | DOUBLE 
    | '(' expr ')' 
    ; 
add: '+' | '-'; 
mult: '*' | '/'; 

이 방법 같은 것에 대해, 당신은 -2, +x 또는 -(2+3) 있지만 2++3 같은 표현을 체결 구축 할 수 있습니다.