2013-07-02 2 views
0

기본 ANTLR 기반 검색을 수행하려고합니다. 원하는 토큰과 일치하지 않는 렉서에 문제가 있습니다. 상기 문법 렉서가 토큰을 건너 뜁니다.

lexer grammar DefaultLexer; 

ALPHANUM : (LETTER | DIGIT)+; 
ACRONYM  : LETTER '.' (LETTER '.')+; 
HOST  : ALPHANUM (('.' | '-') ALPHANUM)+; 

fragment 
LETTER : UNICODE_CLASS_LL | UNICODE_CLASS_LM | UNICODE_CLASS_LO | UNICODE_CLASS_LT | UNICODE_CLASS_LU; 

fragment 
DIGIT : UNICODE_CLASS_ND | UNICODE_CLASS_NL; 

hello. world world 문자열 만의 입력 결과로 주어진다. 반면에 나는 hello과 을 모두 얻을 것으로 예상됩니다. 내가 뭘 놓치고 있니? 감사.

ADDED :

좋아, 내가 ALPHANUM 이상의 규칙 HOST를 사용하여 입력 hello. world 경기 이상의 문자를 따라서 렉서이 그것을 사용하도록 선택하는 것을 배웠습니다. 그런 다음 입력을 HOST 규칙과 일치시키지 못하면 "룩백"하지 않습니다. 이는 렉서가 작동하는 방식이기 때문입니다.

나는 어떻게해야합니까?

답변

1

앞에서 말한 것처럼 ANTLR 4는 이상한 방식으로 작동하지 않습니다. ANTLR 3과 ANTLR 4 모두ALPHANUM과 일치해야하고 2 개의 구문 오류가 발생하고 ALPHANUM과 일치하면 ANTLR 4 이 그런 식으로 행동하게됩니다. 당신의 HOST 규칙 host, 파서 규칙이 될 더 적합 할 수도처럼

  • 는 것 같습니다.
  • . (함께 또는 두 개의 개별 토큰)과 일치 할 수있는 렉서 규칙을 제공하고 제공해야합니다.
+0

좋아, 나는 antlr4 시도해 줄 것이다. –

+0

antlr4를 사용하여 C#을 생성 할 수 없습니다. https://github.com/sharwell/antlr4cs에 따라 프로젝트를 수정 한 후 빌드 도중 '오류 \t 16 알 수없는 빌드 오류 : 오류 : 기본 클래스 Studio를 찾을 수 없거나로드 할 수 없습니다.'라는 메시지가 나타납니다. 그리고 antlr4-csharp-4.0.1-SNAPSHOT-complete.jar를 명령 줄에서 수동으로 실행하려고하면 Java 클래스가 생성됩니다. –

+0

좋아, 나는 msbuild 작업에서 사용할 동일한 매개 변수를 사용하여 명령 줄에서 C#을 생성 할 수있었습니다. 빌드시 왜 작동하지 않는지는 아직 알 수 없습니다. –