7

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

更新

答案是“不可能”吗?

4

3 回答 3

5

首先需要了解解析中各部分的作用:

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

解析器:这是只使用标记来确定语言结构的对象。一种语言(编写为一个或多个语法文件)定义了有效的标记组合。

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

话虽如此,了解为什么要在解析器中跳过单个输入字母可能会有所帮助。看起来您的基本概念需要调整。

于 2013-05-18T08:11:00.227 回答
4

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

于 2013-05-17T17:53:47.233 回答
3

这是可能的,但前提是你有这样一个基本语法,以至于使用 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 ...”作为输入,但不接受“blah blah EL/JSTL ...”。

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

于 2013-06-05T16:46:26.297 回答