2017-10-06 2 views

답변

3

귀하의 WS 규칙은규칙에 의해 깨졌습니다. 규칙은 precedence입니다. 더 정확하게는 문제는 ~[\r\n"]도 공백 문자와 일치한다는 것입니다.

"column a"*"column b" lexes 다음과 같이 '"'COLUMN'"'MULTIPLICATION'"'COLUMN'"'

"column a" * "column b" lexes 다음과 같이 '"'COLUMN'"'COLUMN'"'COLUMN'"'

예 "공간 별 공간"는로 lexed있어토큰은 ANTLR 렉서 규칙이 작동하는 방식이기 때문에 더 긴 토큰 매치가 우선 순위를 얻습니다.

당신이 볼 수 있듯이,이 토큰 스트림이하는 하지 경기 '"'COLUMN'"'입니다 전체 expr 규칙이 할 수있는만큼 너무 expr 일치.

부정적인 규칙만으로 렉서 규칙을 선언하는 것은 항상 나쁜 아이디어입니다. 그리고 별도의 '"' 토큰을 갖는 것은 나에게도 적절하지 않습니다.

COLUMN: '"' (~["\r\n])* '"'; 

그런 다음 파서 규칙에서 독립 따옴표를 제거 : 그들은 논리적으로 토큰의 일부있어 당신이 했어야 무엇

COLUMN 규칙의 따옴표를 포함하는 것입니다. 나중에 구문 분석 트리를 처리 할 때 텍스트의 인용 부호를 지우거나 렉서의 토큰 방출 로직을 변경하여 토큰의 기본 값을 변경할 수 있습니다. 파서를 호출 할 때

formula: expr EOF; 

이 그런 다음 항목 규칙 대신 expr으로이 규칙을 사용

그리고 순서

는 전체 입력을 소비했는지 확인합니다 다른 규칙을 추가, 입력 후행 무시하지합니다 .

+0

자세한 설명을 이용해 주셔서 감사합니다. – tiktak

3

는 그러나 "열은"* "열 B"입력이 예기치 않게 내가 ANTLR 4 문법을 실행하면

를 분석 중지합니다.6, 그것은 파서가 일치하지 수있는 분홍색으로 전체 파일 및 디스플레이를 구문 분석, 구문 분석 멈추지 않는다 :

도트 공백을 나타냅니다.

그리고 중요한 오류 메시지가 : 내가 바로 당신이 "일치하지 않는"오류를 가지고 here 설명으로

line 1:10 mismatched input ' * ' expecting {<EOF>, '*', '/', '+', '-', '%', '^'} 

, GRUN에 -tokens를 추가합니다. "column a"*"column b"

:

$ grun Formula expr -tokens -diagnostics t1.text 
[@0,0:0='"',<'"'>,1:0] 
[@1,1:8='column a',<COLUMN>,1:1] 
[@2,9:9='"',<'"'>,1:9] 
[@3,10:10='*',<'*'>,1:10] 
[@4,11:11='"',<'"'>,1:11] 
[@5,12:19='column b',<COLUMN>,1:12] 
[@6,20:20='"',<'"'>,1:20] 
[@7,22:21='<EOF>',<EOF>,2:0] 

"column a" * "column b"으로 :

$ grun Formula expr -tokens -diagnostics t2.text 
[@0,0:0='"',<'"'>,1:0] 
[@1,1:8='column a',<COLUMN>,1:1] 
[@2,9:9='"',<'"'>,1:9] 
[@3,10:12=' * ',<COLUMN>,1:10] 
[@4,13:13='"',<'"'>,1:13] 
[@5,14:21='column b',<COLUMN>,1:14] 
[@6,22:22='"',<'"'>,1:22] 
[@7,24:23='<EOF>',<EOF>,2:0] 
line 1:10 mismatched input ' * ' expecting {<EOF>, '*', '/', '+', '-', '%', '^'} 

은 즉시 " * "COLUMN로 해석 것을 알 수있다. 렉서 규칙을 입력 일치에 대한

많은 질문은이 마지막 날 요청을받은 :

extraneous input

ordering

greedy

ambiguity

expression

루카스가 문제의 모든 것을 요약 한 답변을하기 위해 거짓 질문을 게시 한 적이 여러 번 있습니다 : disambiguate.