여기에 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
의 두 번째 서브 루클이 왼쪽 재귀 문제를 일으키는 것 같습니다. 왼쪽 재귀가 제거되면 문제가 사라집니다.