考虑以下ANTLR v4语法:
grammar String;
anything: STRING '"'?;
STRING: '"' (ESC|.)*? '"';
fragment
ESC: '\\"' | '\\\\';
这摘自《权威的ANTLR 4参考》一书,但请注意,该不寻常的修改允许在STRING
中anything
之后使用可选的隔离双引号。
此语法对于输入"Orange\""
似乎模棱两可,因为它可以将其解析为"Orange\""
或"Orange\" "
(也就是说,将\
与{{1 }},而不是.
)。前者是解析器实际生成的解析器,因为在选择ESC
中ESC
在.
之前,并且解析器并未探索所有可能的解析以提高效率。
但是,这本书提到使用(ESC|.)
选项运行TestRig
可以打开精确的歧义检测功能。我决定测试此选项是否可以检测到上述歧义,但是在输入-diagnostics
上运行grun String anything -diagnostics
不会产生任何歧义消息。我想念什么?