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



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

答案是"不可能"吗?

首先需要了解解析中每个部分的角色:

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

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

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

已经说过,它可能有助于了解为什么要跳过解析器中的单个输入字母。看来你的基本概念需要调整了

这取决于你所说的"符号"是什么意思。要匹配解析器规则中的任何标记,请使用. (DOT)元字符。如果您试图匹配解析器规则中的任何字符,那么您就不走运了,ANTLR中解析器和词法分析器规则之间有严格的分离。不可能匹配解析器规则中的任何字符。

这是可能的,但前提是您有这样一个基本的语法,无论如何使用ANTlr的理由是否定的。

如果你有语法:

text     : ANY_CHAR* ;
ANY_CHAR : . ;

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

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

然后使用解析器定义语法,因此:
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章)。

相关内容

  • 没有找到相关文章

最新更新