【问题】
antlr中写语法,后来遇到个问题:
下面的写法,竟然出现多种匹配的问题:
但是很奇怪:
之前遇到这种多重匹配的话,相对来说,都是可以看到
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中的:
很是不理解。
就是普通的,用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.截止目前,还是没搞懂。
【总结】
转载请注明:在路上 » 【未解决】antlr中STRING出现多重匹配的问题:Decision can match input such as "STRING" using multiple alternatives: 1, 2