문제

문법이 결합되어 있습니다 (동일한 파일의 Lexer 및 Parser). 어떻게 설정합니까?

filter = true

렉서에게?

감사

도움이 되었습니까?

해결책

Bart가 그의 대답에서 말한 것을 명확히하기 위해 :

The options{filter=true;} only works in lexer-grammars. You will need to define a parser- and lexer grammar in two separate files:

실제로 Lexer와 Parser를 2 개의 별도 파일에 넣을 필요는 없습니다. Lexer 문법에 필터 규칙을 배치하면됩니다. Lexer와 Parser 문법 모두 ~할 수 있다 같은 파일에 있습니다.

Bart의 분리 된 파일에 넣는 조언은 내가 일반적으로 사용하는 접근법이지만.

따라서 예를 들어 보려면 단일 파일 로이 작업을 수행 할 수 있습니다.

Parser 및 Lexer Grammar.g가있는 단일 파일 g

parser grammar FooParser;

parse
:  Number+ EOF
;

lexer grammar FooLexer;

options{filter=true;}

Number
:  '0'..'9'+
;

필터 규칙이 Lexer 클래스 정의에있는 방법에 유의하지만 Lexer와 Parser는 동일한 파일에 있습니다.

다른 팁

당신은 그렇지 않습니다. 그만큼 options{filter=true;} Lexer-Grammars에서만 작동합니다. 두 개의 개별 파일에서 파서 및 렉서 문법을 정의해야합니다 (편집하다: 아니요, 그들은 하나의 파일로 넣을 수 있습니다. Chollida의 답변을 참조하십시오) :


fooparser.g

parser grammar FooParser;

parse
  :  Number+ EOF
  ;


우우 렉서 .g

lexer grammar FooLexer;

options{filter=true;}

Number
  :  '0'..'9'+
  ;


이 Lexer와 Parser를 결합하면 숫자로 구성된 파일 (또는 문자열)의 문자열 만 구문 분석하는 파서가됩니다.

Lexer 규칙이 표시되지 않지만 명령 줄에서 Lexer 및 Parter를 생성하기 때문에 Antlr 플러그인 또는 antlrworks가 불평 할 수 있습니다.

java -cp antlr-3.2.jar org.antlr.Tool FooLexer.g 
java -cp antlr-3.2.jar org.antlr.Tool FooParser.g 

잘 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top