当前位置: 首页 > 知识库问答 >
问题:

Antlr4-隐式定义

商兴朝
2023-03-14

我正在尝试创建一个目前仅限使用的简单整数算术表达式解析器。目前我有:

grammar MyExpr;

input: (expr NEWLINE)+;


expr: '(' expr ')'
    | '-' expr
    | <assoc = right> expr '^' expr
    | expr ('*' | '/') expr
    | expr ('+' | '-') expr
    | ID '(' ExpressionList? ')'
    | INT;

ExpressionList : expr (',' expr)*; 


ID : [a-zA-Z]+;
INT : DIGIT+;
DIGIT: [0-9];
NEWLINE : '\r'?'\n';
WS : [\t]+ -> skip;

规则ExpressionList似乎会导致一些问题。如果我删除所有包含ExpressionList的内容,一切都会编译并且似乎运行良好。但像上面一样,我收到了以下错误:

error(160): MyExpr.g4:14:17: reference to parser rule expr in lexer rule ExpressionList
error(126): MyExpr.g4:7:6: cannot create implicit token for string literal in non-combined grammar: '-'

我正在使用Eclipse和Antlr4插件。我试图根据antlr4书中给出的cymbol语法来确定自己的方向。

有人能告诉我我的小语法出了什么问题吗?

共有1个答案

南门祯
2023-03-14

自己找出来的:

以大写字母开头的规则指Lexer规则。所以我所要做的就是将我的ExpressionList重命名为ExpressionList。

也许有一天其他人会发现这很有用;)

 类似资料:
  • 如果我对“令牌”不感兴趣,因为规则已经建立了我要匹配的对象,而且我无论如何都要跳过它,那么用和令牌声明替换它有意义吗?(然后,代币的数量将会增加。)为什么在ANTLRWorks中这是一个警告?

  • 如何实现这些模式?

  • 提示:它应该看起来像隐式的[固体](... 太感谢你了!

  • 我正在用C写这个链表程序 我测试程序时发现了错误 linkedlist。cpp:5:24:错误:隐式声明的“constexpr LinkedList::LinkedList()”LinkedList::LinkedList()的定义{ 这是密码 Linkedlist. h文件: linkedlist。cpp文件: 请帮忙。

  • 我是ANTLR的新手,我试图使用ANTLR4和C#为计算器应用程序生成一个相对简单的解析器。这是我的语法文件。 我编写了一个自定义词法分析器来生成令牌,以便在解析之前支持变量的隐式乘法和转换为其数字等效值。 但是输入后,我得到以下结果。 请注意,我尝试关闭错误恢复功能并将其设置为报告所有歧义错误,但似乎没有收到任何错误。 无论如何,如果我通过删除除法/乘法运算符之后的?将语法更改为以下内容,那么它