结合语法ANTLR选项过滤器

时间:2010-02-09 10:44:57

标签: filter antlr grammar lexer

我有一个组合语法(词法分析器和解析器在同一个文件上)。如何设置

filter = true

到lexer?

由于

2 个答案:

答案 0 :(得分:3)

澄清巴特在答案中所说的话:

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

您实际上并不需要将词法分析器和解析器放在2个单独的文件中。您只需要将过滤规则放在词法分析器语法中。词法分析器和解析器语法都可以在同一个文件中。

尽管Bart建议将它们放在单独的文件中,但我通常使用这种方法。

举一个例子,你可以在一个文件中做到这一点

带解析器和词法分析器的单个文件Grammar.g

parser grammar FooParser;

parse
:  Number+ EOF
;

lexer grammar FooLexer;

options{filter=true;}

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

请注意过滤规则是如何在词法分析器类定义中,但是词法分析器和解析器在同一个文件中。

答案 1 :(得分:1)

你没有。 options{filter=true;}仅适用于词法分析器。您需要在两个单独的文件中定义解析器和词法分析器语法(编辑:否,它们可以放在一个文件中,请参阅chollida的答案):


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 

工作正常。