2017-12-17 17 views
1

저는 문법을 작성하는 중이지만 대괄호 문제와 작업 우선 순위를 처리 할 수는 없습니다. 1 + 3은 4를 제공하지만 문법은 (1 + 3) * 3 = 12 문제와 1 + 3 * 3 = 12를 처리해야합니다. 문법에 홀수가 있지만 중요하지 않습니다. 여기 Python Antlr4 대괄호

내 문법 코드 :

grammar PolishNotation; 

fragment SINGLE_SPACE : '\u0020'; // ' ' 
fragment TABULATION  : '\u0009'; // '\t' 
fragment LINE_FEED  : '\u000A'; // '\n' 
fragment CARRAIGE_RETURN: '\u000D'; // '\r' 
fragment DECEVEN  : '0' | '2' | '4' | '6' | '8'; 
fragment DECODD   : '1' | '3' | '5' | '7' | '9'; 
fragment HEXEVEN  : '0' | '2' | '4' | '6' | '8' | 'A' | 'C' | 'E'; 
fragment HEXODD   : '1' | '3' | '5' | '7' | '9' | 'B' | 'D' | 'F'; 
fragment OCTEVEN  : '0' | '2' | '4' | '6'; 
fragment OCTODD   : '1' | '3' | '5' | '7'; 

Add   : '+'; 
Subtract  : '-'; 
Multiply  : '*'; 
Divide  : '/'; 
Colon   : ':' -> type(Divide); 
Power   : '^'; 
DoubleMultiply: '**' -> type(Power); 
Max   : 'max'; 
Min   : 'min'; 

Int   : (DECODD) 
       | ([1-9]+ (DECODD | DECEVEN)* (DECODD)) 
       ; 
Hex   : ('0x' (HEXODD)) 
       | ('0x' [1-F]+ (HEXODD | HEXEVEN)* (HEXODD)) 
       ; 
Oct   : ('0o' (OCTODD)) 
       | ('0o' [1-7]+ (OCTODD | OCTEVEN)* (OCTODD)) 
       ; 

WhiteSpace : (SINGLE_SPACE | TABULATION)+ -> skip; 
NewLine  : (CARRAIGE_RETURN | LINE_FEED)+ -> skip; 

number  : Int | Hex | Oct 
       ; 
operation  : (number) 
       op=(Add 
       | Subtract 
       | Multiply 
       | Divide 
       | Power 
       | Max 
       | Min) 
       (number | operation) 
       | '(' operation ')' 
       ; 
expression : operation 
       | number 
       ; 

답변

0

여기에 두 가지 누락 된 문법; 우선 순위 규칙 및 재귀 하위 식 (즉, 대괄호)이 있습니다. 다음과 같이 일반적인 표현 문법 용어 & 요인 일련의 아래로 식을 파괴함으로써이를 달성합니다

expression : term ((Add | Subtract) term)* ; 
term   : factor ((Multiply | Divide) factor)* ; 
factor  : number | '(' expression ')' ; 

그래서 원이 뒤에 이론과 실천에 사용할 수 많은 튜토리얼과 책이있다 자세한 내용을 여기에 복사하지 마십시오 (this one 또는 this one을 시도하십시오).

내가 다루는 문법이 필요합니다 (1 + 3) * 3 = 12 문제 1 + 3 * 3 = 12 여기

당신이 플러스 가지고해야한다는 의미있다 보다 우선 순위가 높습니다. (보통 BODMAS 선행 규칙이 아님)을 곱하면 원하는 것이 맞습니까? 그렇다면 위의 내용을 문법에서 재 작업하여 원하는 우선 순위를 부여하는 방법을 알기를 바랍니다.

0

고맙습니다. 답장을 보내 주셔서 감사합니다. 나는 이와 같은 일을했지만 모든 옵션에 대해 작동하지 않습니다.

number  : Int | Hex | Oct 
       ; 
operation  : (('(') (number) (op=(Add|Subtract|Multiply|Divide|Power|Max|Min)) (number) (')')) 
       | number 
       ; 
muldiv  : ((operation) (op=(Multiply|Divide)) (operation)) 
       |operation 
       ; 
addsub  : ((muldiv) (op=(Add|Subtract)) (muldiv)) 
       | muldiv 
       ; 
expression : ((addsub) (op=(Add|Subtract|Multiply|Divide|Power|Max|Min) (addsub))) 
       | addsub 
       | number 
       ;