【发布时间】:2015-04-12 22:00:01
【问题描述】:
我面临一个模棱两可的情况,输入字符串可以使用不同的规则进行解析,我需要考虑这两个选项并为它们生成多个解析树。
为简单起见,考虑到像“Alber Johanson”这样的人名,这个名字可以被解析为
(fullName (firstName Alber) (lastName Johanson))
或解析为
(fullName (firstName Alber) (lastName Johan) (relation son))
首先,如何配置规则来处理第二种情况?因为它是第二个字符串的一部分,而不是单独的标记。
二、如何为输入字符串的所有可能选项生成解析树?
更新
这是我拥有的语法示例,它只能用于解析第一种情况,而不能用于解析第二种情况
fullName: firstName lastName | firstName lastName relation;
firstName: NAME;
lastName: NAME;
relation: REL;
NAME: ('a'..'z'|'A'..'Z')+;
REL: 'son';
WHITESPACE : ('\t' | ' ' | '\r' | '\n'| '\u0020' | '\u000C' )+ -> skip ;
【问题讨论】:
-
回答您关于如何配置规则的问题这完全是您的(应用程序)决定(要求)!我们至少需要知道在您的应用程序中应该如何拆分名称? Johanson 应该分为 Johan 和 son 吗?还有什么规则?我们需要更多地了解您为开发您的应用程序所做的尝试。
-
@user3320018 我用我拥有的语法更新了我的问题
-
您想以不同的方式处理这些案例,还是为什么要生成多个解析树?
-
@CoronA 的答案是正确的;你不能做你想做的事,但那是因为词法分析器。您有一个更深层次的问题,即产生多个解析解释。 ANTLR 不是为此而设计的,弯腰这样做可能非常困难。您可以考虑改用 GLR 解析器;它们旨在产生所有可能的解析。 GLR 解析器不会解决您的词法分析问题;你需要先决定你想做什么。
-
@AdrianLeonhard 是的,我想收集名称结构的所有可能选项,以便稍后在我的应用程序中处理