Комбинированный грамматический ANTLR вариант фильтра - PullRequest
1 голос
/ 09 февраля 2010

У меня есть объединенная грамматика (лексер и парсер в одном файле). Как мне установить

filter = true

к лексеру?

Спасибо

Ответы [ 2 ]

3 голосов
/ 09 февраля 2010

Чтобы прояснить, что Барт сказал в своем ответе:

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

На самом деле вам не нужно помещать лексер и парсер в 2 отдельных файла. Вам просто нужно поместить правило фильтра в грамматику лексера. И лексер, и грамматика синтаксического анализатора могут находиться в одном файле.

Хотя совет Барта поместить их в отдельные файлы - это подход, который я обычно использую.

Итак, для примера вы можете сделать это в одном файле

Отдельный файл с парсером и лексером Grammar.g

parser grammar FooParser;

parse
:  Number+ EOF
;

lexer grammar FooLexer;

options{filter=true;}

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

Обратите внимание, что правило фильтрации находится в определении класса лексера, но лексер и анализатор находятся в одном файле.

1 голос
/ 09 февраля 2010

Ты не. options{filter=true;} работает только в лексер-грамматиках. Вам нужно будет определить грамматику синтаксического анализатора и лексера в двух отдельных файлах ( EDIT : нет, их можно поместить в один файл, см. Ответ Холлиды):


FooParser.g

parser grammar FooParser;

parse
  :  Number+ EOF
  ;


FooLexer.g

lexer grammar FooLexer;

options{filter=true;}

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


Объединение этих лексеров и парсеров приведет к парсеру, который будет анализировать только строки в файле (или строке), состоящей из цифр.

Обратите внимание, что плагины ANTLR или ANTLRWorks могут жаловаться, потому что правила лексера не видны ему, но генерируют лексер и синтаксический анализатор в командной строке:

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

отлично работает.

...