2016-10-27 2 views
0

ANTLR에서 논리적 연산자와 괄호를 함께 포함하는 표현식을 나타내는 문법을 정의하려고합니다. 여기
문법ANTLR 문법에서 괄호를 사용하여 논리 연산자를 정의하는 방법

grammar simpleGrammar; 

/* This will be the entry point of the parser. */ 

parse 
    : 
     expression EOF 
    ; 
expression 
    : 
     expression binOp expression | ID | unOp (expression) | '(' expression ')' 
    ; 
binOp 
    : 
     ('AND' | 'OR') 
    ; 
unOp 
    : 
     'NOT' 
    ; 
ID  : 
     ('a'..'z' | 'A'..'Z')+ 
    ; 

정의 된 문법 괄호없이 구문 분석 트리를 표현할 수있는 수 있지만 입력 예를 들어 괄호와 예를 (Apple OR Bananana)AND Orange 그것은 MismatchedTokenException
그래서 보여주고있다, 그것은 것입니다 누군가가 괄호를 표현하기 위해 문법을 정의하는 방법을 설명하면 정말 고맙게 생각합니다.

답변

1

ANTLR에게 공백을 어떻게 처리해야하는지 잊어 버렸습니다. 예 :

WS : [ \t\r\n] -> skip; 

문법을 추가하면됩니다.

문법은 ANDOR 연산자에 대해 우선 순위가 같습니다. 그리고이 연산자는 NOT보다 우선합니다. 이것은 기존의 규칙 위반에도 있듯이,이 대신처럼 expression 규칙을 작성하는 방법을 조언 것 :

expression 
    : '(' expression ')'   # parenExp 
    | 'NOT' expression    # notExpr 
    | expression 'AND' expression # andExpr 
    | expression 'OR' expression # orExpr 
    | ID       # atomExpr 
    ; 
+0

그 예외를 보여줍니다이 상호 재귀 적 '표현'과 'expression'와'표현 '또는'남아 있으므로 expression' –

+0

아니요, 직접 왼쪽 재귀 식입니다. ANTLR4는 이것을 처리 할 수 ​​있지만 ANTLR3은 그렇지 않습니다. 원래 질문에는 직접 왼쪽 재귀가 포함되어 있으므로 v4를 사용하고 있다고 가정합니다. –

관련 문제