组合语法ANTLR选项过滤器

问题描述 投票:0回答:3

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

filter = true

到词法分析器?

谢谢

filter antlr grammar lexer
3个回答
4
投票

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

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

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

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

举个例子,您可以在单个文件中执行此操作

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

parser grammar FooParser;

parse
:  Number+ EOF
;

lexer grammar FooLexer;

options{filter=true;}

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

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


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 

工作正常。


0
投票

只是,不要分别将 parser Grammar yourGrammarlexer Grammar yourLexer 添加到解析器和词法分析器文件中,而是将 grammar yourGrammarAndLexer 添加到组合文件的开头 ^^

© www.soinside.com 2019 - 2024. All rights reserved.