如何匹配ANTLR解析器(未词法)任何符号?(How to match any symbol in

2019-09-03 21:21发布

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

UPDATE

就是答案是“不可能的”?

Answer 1:

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

词法分析器:这是你的标记化输入字符串的对象。 标记化装置的输入字符流转换为一个抽象的令牌符号(通常只是一个数字)。

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

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

说了这么多话,大概有助于了解为什么要跳过各个输入字母解析器。 看起来像你的基本概念需要调整。



Answer 2:

这取决于你所说的“符号”。 为了匹配解析器规则内的任何标记,使用. (DOT)的元炭。 如果你想任何字符匹配解析器规则里面,那么你的运气,有在ANTLR parser-和词法规则之间的严格分离。 这是不可能匹配解析器规则内的任何字符。



Answer 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       : . ;

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

我建议在寻找权威ANTLR 4参考,特别是对“流中的岛屿”和语法参考(第15章),与Unicode的专门处理的部分。



文章来源: How to match any symbol in ANTLR parser (not lexer)?