如何匹配ANTLR解析器中的任何符号(不是词法分析器)?

时间:2013-05-16 22:21:02

标签: parsing antlr grammar antlr4

如何匹配ANTLR解析器中的任何符号(不是词法分析器)? ANTLR4解析器的完整语言描述在哪里?

更新

答案是“不可能的”吗?

3 个答案:

答案 0 :(得分:5)

首先需要了解每个部分在解析中的作用:

词法分析器:这是标记输入字符串的对象。标记意味着将输入字符流转换为抽象标记符号(通常只是一个数字)。

解析器:这是仅与令牌一起使用以确定语言结构的对象。语言(写为一个或多个语法文件)定义有效的令牌组合。

正如您所看到的,解析器甚至不知道字母是什么。它只知道令牌。所以你的问题已经错了。

说过这可能有助于你知道为什么要在解析器中跳过单个输入字母。看起来您的基本概念需要调整。

答案 1 :(得分:4)

这取决于你所说的“符号”。要匹配解析器规则中的任何标记,请使用.(DOT)元字符。如果你试图匹配解析器规则中的任何字符,那么你运气不好,ANTLR中的解析器和词法分析器规则之间存在严格的分离。无法匹配解析器规则中的任何字符。

答案 2 :(得分:2)

这是可能的,但只有你有这样一个基本语法,无论如何都要否定使用ANTlr的理由。

如果你有语法:

text     : ANY_CHAR* ;
ANY_CHAR : . ;

它会做你(似乎)想要的。

然而,正如许多人所指出的那样,这将是一件非常奇怪的事情。词法分析器的目的是识别可以在解析器中串起来形成语法的不同标记,因此您的词法分析器可以将特定字符串“JSTL / EL”标识为标记,或者[AZ] '/ EL',[AZ] '/'[AZ] [AZ]等 - 取决于您的需要。

然后使用解析器来定义语法,所以:

phrase     : CHAR* jstl CHAR* ;
jstl       : JSTL SLASH QUALIFIER ;

JSTL       : 'JSTL' ;
SLASH      : '/'
QUALIFIER  : [A-Z][A-Z] ;
CHAR       : . ;

接受“blah blah JSTL / EL ...”作为输入,但不是“等等等等EL / JSTL ......”。

我建议查看The Definitive ANTlr 4 Reference,特别是关于“流中的群岛”和专门处理Unicode的语法参考(第15章)的部分。