语法:语法选择的优先顺序

时间:2015-06-20 11:24:54

标签: parsing antlr grammar context-free-grammar

这是关于语法替代方案的一个非常基本的问题。如果您有以下替代方案:

Myalternative: 'a' | .;
Myalternative2: 'a' | 'b';

'a'优先于'。'和'b'?

我理解这也可能取决于这种语法生成的解析器的行为,但在纯理论语法术语中你能想象这些规则是并行匹配的,即对“a”和“。”进行测试。同时选择优先级最高的那个?或者是'a'和。由于语法中缺乏优先权而含糊不清?

1 个答案:

答案 0 :(得分:1)

答案主要取决于您使用的工具,以及该工具的语义。正如所写,这不是规范形式的无上下文语法,你需要产生它来获得理论答案,因为只有这样才能澄清预期的语义。

由于问题标记为,我猜测这是Antlr词法定义的一部分,其中.是通配符。在这种情况下,'a' | .表示与<{1}}完全相同

由于.匹配MyAlternative匹配的所有内容,并且由于MyAlternative2在Antlr词法定义中排在第一位,因此MyAlternative永远不会匹配任何内容。任何单个字符都将由MyAlternative2匹配(除非有一些其他词法规则与更长的输入字符序列匹配)。

如果您将MyAlternative的定义放在语法文件中,那么MyAlternative2a将匹配为b,而任何其他字符将匹配为MyAlternative2

在替代方案中的优先权问题毫无意义。 MyAlternative是否认为MyAlternative的匹配与a的匹配或a的匹配无关紧要。最后,它是.的匹配,并且该符号只能有一个相关的操作。

在词法规则之间存在优先关系:第一个获胜。 (更准确地说,据我所知,Antlr遵循最长匹配获胜的通常惯例;在两个匹配相同最长序列的规则之间,语法文件中的第一个获胜。)这不受任何方式影响规则本身的替代条形。