【问题标题】:antlr4: why is `tree` unusable as a rule name?antlr4:为什么`tree`不能用作规则名称?
【发布时间】:2018-09-01 00:02:18
【问题描述】:

如果我保存语法

grammar L;

tree: 't' ;
a: tree | 'b' ;

在文件名L.g4 中调用antlr4 L.g4(4.7.1 版),它会输出一条不带任何行号或列号的难以理解的错误消息:

L.g4::: 语法错误:不匹配的字符 '|'期待“g”

::: 部分是错误的行号/列号通常所在的位置。

如果我改为保存

grammar L;

tre: 't' ;
a: tre | 'b' ;

作为L.g4 并在其上运行antlr4,它运行没有错误。

tree 标识符有什么问题?不在reserved keywords列表中:

导入、片段、词法分析器、解析器、语法、返回、 locals, throws, catch, finally, 模式, 选项, 标记

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

    tree 是一个reserved keyword in ANTLR v3。我猜文档可能不完整,也可能是一个错误。该文档还提到了不能用作规则名称的非关键字(例如单词rule),因此tree 可能是相似的 - 不是真正的关键字,但不允许在任何地方使用。

    根据这个unresolved ANTRL4 bug report for your issue,如果您删除tree 和: 之间的空格,它会起作用。

    【讨论】:

    • this answer 似乎仍然相关,它似乎很乐意将未转义的规则名称用作 Java 代码中的方法名称:public final BobbyTablesContext bobbyTables()。如果我使用throw 或private 而不是bobbyTables,我想不会有什么好事发生。谢谢,我会在选择规则名称时更加小心。 (较小的更正:throw 实际上会生成很好的错误消息。)
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2015-02-26
    • 2015-01-06
    相关资源
    最近更新 更多