antlr4를 사용하여 표현 엔진을 작성하고 싶습니다.
다음은 문법입니다.antlr4를 사용하는 방법 특성 액세스 식, 메서드 호출 식, 배열 액세스 식을 구별 할 수있는 더 나은 파서를 작성 하시겠습니까?
expression
: primary
| expression '.' Identifier
| expression '(' expressionList? ')'
| expression '[' expression ']'
| expression ('++' | '--')
| ('+'|'-'|'++'|'--') expression
| ('~'|'!') expression
| expression ('*'|'/'|'%') expression
| expression ('+'|'-') expression
| expression ('<' '<' | '>' '>' '>' | '>' '>') expression
| expression ('<=' | '>=' | '>' | '<') expression
| expression ('==' | '!=') expression
| expression '&' expression
| expression '^' expression
| expression '|' expression
| expression '&&' expression
| expression '||' expression
| expression '?' expression ':' expression
| <assoc=right> expression
( '='
| '+='
| '-='
| '*='
| '/='
| '&='
| '|='
| '^='
| '>>='
| '>>>='
| '<<='
| '%='
)
expression
;
이 문법은 올바르지 만 액세스 속성 expr, 메소드 호출 expr, 배열 액세스 expr을 구분할 수 없습니다. 그래서 내가
attributeAccessMethod:
expression '.' Identifier;
expression
: primary
| attributeAccessMethod
| expression '(' expressionList? ')'
| expression '[' expression ']'
| expression ('++' | '--')
| ('+'|'-'|'++'|'--') expression
| ('~'|'!') expression
에 문법을 변경하지만,이 문법은 [attributeAccessMethod 표현]왼쪽 재귀, 그래서 어떻게 더 나은 문법이 왼쪽 재귀를 제거하고 이러한 조건을 구별 할 수 쓰기?
이 대답에서 직접 왼쪽 재귀를 제거하는 규칙을 설명했습니다 : [ANTLR4 상호 왼쪽 재귀 문법] (http://stackoverflow.com/questions/41788100/antlr4-mutual-left-recursion-grammar/41789097#41789097) –