繁体   English   中英

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

[英]How to match any symbol in ANTLR parser (not lexer)?

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

更新

答案是“不可能”吗?

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

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

解析器:这是仅与标记一起工作以确定语言结构的对象。 一种语言(编写为一个或多个语法文件)定义了有效的标记组合。

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

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

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

这是可能的,但前提是您拥有如此基本的语法,以至于无论如何都可以否定使用 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 章)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM