1

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

filter = true

到词法分析器?

谢谢

4

2 回答 2

4

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

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'+
;

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

于 2010-02-09T18:11:15.513 回答
2

你没有。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 

工作正常。

于 2010-02-09T13:14:53.113 回答