답변
귀하의 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
으로이 규칙을 사용
그리고 순서
는 전체 입력을 소비했는지 확인합니다 다른 규칙을 추가, 입력 후행 무시하지합니다 .는 그러나 "열은"* "열 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
로 해석 것을 알 수있다. 렉서 규칙을 입력 일치에 대한
많은 질문은이 마지막 날 요청을받은 :
루카스가 문제의 모든 것을 요약 한 답변을하기 위해 거짓 질문을 게시 한 적이 여러 번 있습니다 : disambiguate.
- 1. 예기치 않게 mod_rewrite가 실행됩니다.
- 2. 셀레늄 RC가 예기치 않게 10 분 후 예기치 않게 종료됩니다.
- 3. 예기치 않게 인스턴스 속성이로드되었습니다.
- 4. MySQL이 예기치 않게 충돌합니다.
- 5. 백본보기가 예기치 않게 업데이트되었습니다.
- 6. plugin_host가 예기치 않게 종료되었습니다.
- 7. 가 예기치 않게
- 8. 가 예기치 않게
- 9. RecyclerView가 예기치 않게 동작
- 10. 예기치 않게 XQuartz가 종료됩니다.
- 11. 예기치 않게 세션이 사라집니다.
- 12. 예기치 않게 변경 권한
- 13. 세마포어 예기치 않게 설정하기
- 14. NSString이 예기치 않게 __NSCFDictionary가됩니다.
- 15. 예기치 않게 Behat가 종료됩니다.
- 16. 예기치 않게 프로세스가 종료됩니다.
- 17. 예기치 않게 종료되는 LaunchDaemon
- 18. FileWriter가 예기치 않게 중지됩니다.
- 19. 예기치 않게 변수가 지워졌습니다.
- 20. NumberFormatter는 예기치 않게
- 21. 예기치 않게 URL이 변경되었습니다.
- 22. 데몬이 예기치 않게
- 23. 예기치 않게 항상 중단되었습니다.
- 24. 스타일이 예기치 않게
- 25. 예기치 않게 작동하는 양식
- 26. numpy.bitwise_and.reduce가 예기치 않게 작동합니까?
- 27. 예기치 않게 lxde가 종료됩니다.
- 28. json_decode가 예기치 않게 작동합니다.
- 29. 박쥐 스크립트가 예기치 않게
- 30. 예기치 않게 CompileXaml이 실패했습니다.
자세한 설명을 이용해 주셔서 감사합니다. – tiktak