【问题标题】:Antlr weird parentheses syntaxAntlr 奇怪的括号语法
【发布时间】:2021-03-03 21:04:17
【问题描述】:

无法理解这个圆括号的含义。 不必写,但有时会产生左递归错误。我们应该在语法规则的什么地方使用它?

【问题讨论】:

  • 它被称为"grouping"。当您编写括在括号(“圆括号”)中的符号序列时,该序列被视为出现在规则的其他符号之前或之后的单个组。例如“S : a (b | c)* d;”可以表示语言 { ad, abd, acd, abbd, accd, abcd, acbd, etc. }。您总是可以为 EBNF 语法编写等效的 BNF 语法,并且如果您在 Antlr4 接受您的语法时遇到问题 - 这并不常见。

标签: syntax antlr grammar left-recursion


【解决方案1】:

不用写了,

没错,没必要。只需删除它们。

但有时会产生左递归错误。

如果确实如此,您可以在这里打开一个问题:https://github.com/antlr/antlr4/issues

编辑

看到 kaby76 的评论,只是为了确保:无论如何,您不能只将它们从语法文件中删除。它们可以从您的示例规则中删除。

当这样使用时:

rule
 : ID '=' ( NUMBER | STRING ) // match either `ID '=' NUMBER` 
                              //           or `ID '=' STRING`
 ;

无法移除它们,因为移除它们会导致:

rule
 : ID '=' NUMBER | STRING // match either `ID '=' NUMBER` 
                          //           or `STRING`
 ;

或重复:

rule
 : ( ID STRING )+ // match: `ID STRING ID STRING ID STRING ...`
 ;

还有这个:

rule
 : ID STRING+ // match: `ID STRING STRING STRING ...`
 ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多