【未解决】antlr中STRING出现多重匹配的问题:Decision can match input such as "STRING" using multiple alternatives: 1, 2

【问题】

antlr中写语法,后来遇到个问题:

下面的写法,竟然出现多种匹配的问题:

rule call string token will multiple alternatives

但是很奇怪:

之前遇到这种多重匹配的话,相对来说,都是可以看到

Syntax Diagram中,也只是,对于当前的rule(或token),

此处,就应该是direct_or_multi_lan_str

只对当前的direct_or_multi_lan_str,显示图表,表示多重匹配

但是从来不会涉及到,该rule的调用者

而此处,很明显,除了说direct_or_multi_lan_str多重匹配,

而且还把其调用者string_value,common_editFormat等等,都画出来了。

 

但是最最奇怪的是:

此处,只是很简单的:

//fragment
STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
//    :  '""' | NON_SINGLE_LAN_STR | SINGLE_LAN_STR
    ;

//fragment
direct_value 	:	(DECIMAL_VALUE | HEX_VALUE);

string_value	:	(IMPORTED_VALUE | ID | direct_or_multi_lan_str); // support multi language string

direct_or_multi_lan_str	:	STRING+;

没有其他任何特殊的写法。

含义本身也是很明显的,

但是为何会出现多重匹配的问题?

即:

对于direct_or_multi_lan_str的Syntax Diagram中的:

why STRING become multiple alternatives

很是不理解。

就是普通的,用token:STRING去表示字符串而已

没有特殊的其他复杂的写法

但是却会导致此处的STRING部分说是有多重匹配。

【解决过程】

1.折腾了很长时间,还是无解。没有彻底真正搞懂STRING变成多重匹配的原因。

2.发现一个现象:

如果把上面的rule:direct_or_multi_lan_str

改为别的

或者是别的rule或toke中包含STRING+的写法

则结果也会变成:

该rule或token,就变成了multiple alternatives了。

3.故意去改为:

direct_or_multi_lan_str	:	STRING STRING;

倒是不会有多重匹配。但是无法保留我原先的本意。

4.改为:

direct_or_multi_lan_str	:	STRING STRING*;

就还是会出现多重匹配的问题。

所以,很明显,就是:

STRING,无法写成*或+,既无法表示0或多个,1或多个。

5.难道STRING的写法:

//fragment
STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
//    :  '""' | NON_SINGLE_LAN_STR | SINGLE_LAN_STR
    ;

本身就能匹配到这几类的字符串:

"xxx"  "yyy"

"xxx""yyy"

????

感觉不对吧?

6.截止目前,还是没搞懂。

 

【总结】



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量