2016-11-26 1 views
0

여기에 C 구문 분석 문법의 작동 하위 집합이 있습니다. 아래에 표시된 입력 만 구문 분석 할 수 있지만 전체 문법에서 발생한 문제를 설명하기에 충분합니다.ANTLR4의 이상한 의미 론적 행위가 버그 일 수 있습니다.

grammar CPPProcessor; 
translation_unit: expression; 
primary_expression: 
    '1' 
    //| {false}? '(' expression ')' 
    | 'a' 
    | 'b' 

; 
postfix_expression: 
     primary_expression 
    | postfix_expression '(' expression ')' 

; 

unary_expression: 
     postfix_expression 
    | '-' cast_expression 
; 
cast_expression: 
     unary_expression 
    | '(' 'a' ')' cast_expression 
; 
additive_expression: 
     cast_expression 
    | additive_expression '-' cast_expression 
; 
expression : additive_expression; 
WS: [ \t\f]+ -> channel(1); 
CRLF: '\r'? '\n' -> channel(1); 

호출 규칙이 translation_unit하고 입력이 포함 된 단일 라인 : primary_expression의 의미 조건이 주석하고있다

(a)-b 

공지 사항은 연산자 우선 순위를 정의하기 위해 전통적인 방법을 다음과 참고 . (문법을 해석하는 방법은 두 번째 규칙이 primary_expression 인 경우 입력을 빼기로 해석 할 때 서브 루틴이 없으면 -b의 C 스타일 유형 캐스트가 a으로 입력 됨).

문제 : 실제 문제는 {false}?은 아무 것도없는 것과 같습니다. 따라서 주석을 제거해도 아무런 차이가 없어야합니다.

line 1:0 no viable alternative at input '(' 

{false}? 의미 술어를 갖는 구문 분석 오류가 발생할 수 있습니다 이유 : 내가 코멘트 즉

primary_expression: 
    '1' 
    | {false}? '(' expression ')' 
    | 'a' 
    | 'b' 

; 

을 제거하고이 오류를 받았을 때 그러나, 구문 분석 실패? ANLTR4의 버그 일 수 있습니까? postfix_expression의 두 번째 서브 루클이 왼쪽 재귀 문제를 일으키는 것 같습니다. 왼쪽 재귀가 제거되면 문제가 사라집니다.

답변

0

문제점을 파악했습니다.

의미 론적 조건어는 상위 규칙을 추적하여 다른 하위 규칙을 시도 할 수 없습니다. 따라서 두 번째 subrule 인 primary_expression이 주석 처리되지 않은 경우 다른 '('일치 규칙이 표시되고 cast_expression의 첫 번째 하위 규칙이 입력으로 선택 될 수 있습니다.하지만 일단이 선택이 이루어지면 일부 의미 론적 조건 자라하더라도 취소 할 수 없습니다 의미 상 술어는 primary_expression의 다른 하위 규칙을 선택할 수 있지만 primary_expression에는 '('와 일치 할 수있는 다른 하위 규칙이 없으므로 구문 분석에 실패합니다.