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

java - 有没有大佬懂antlr,这段简单的antlr为什么会报错?

辛渝
2023-11-27

image.png

grammar Expr;prog: expr EOF;expr: expr('*'|'/') expr  #MultiOrDiv    | expr('+'|'-') expr  #AddOrSub    | INT     #Lieteral    | '(' expr ')'   #Single    ;NEWLINE : [\r\n]+ -> skip;

刚学antlr,最简单的这个antlr应该是实现加减乘除法,但是一直报语法错误

1:1 token recognition error at: '+'1:3 token recognition error at: '*'1:2 mismatched input '2' expecting {, '*', '/', '+', '-'}

有没有懂的大佬指教下!

共有1个答案

尹凌龙
2023-11-27

原因

你的 INT 没有定义。

解决方法

grammar Expr;fragment Digits    : [0-9] ([0-9_]* [0-9])?    ;INT:    ('0' | [1-9] (Digits? | '_'+ Digits));prog: expr EOF;expr: expr('*'|'/') expr  #MultiOrDiv    | expr('+'|'-') expr  #AddOrSub    | INT     #Lieteral    | '(' expr ')'   #Single    ;NEWLINE : [\r\n]+ -> skip;

结果

image.png

 类似资料:
  • 问题内容: 我想开始使用ANTLR,但是花了几个小时在antlr.org网站上回顾了这些示例之后,我仍然对Java语法没有一个清晰的了解。 是否有一些简单的示例,例如使用ANTLR实现的四运算计算器,经过解析器定义,一直到Java源代码? 问题答案: 注意:此答案适用于ANTLR3!如果你正在寻找ANTLR4的示例,那么此问答将演示如何使用ANTLR4创建简单的表达式解析器和评估器。 你首先创建一

  • 本文向大家介绍ANTLR 简单规则,包括了ANTLR 简单规则的使用技巧和注意事项,需要的朋友参考一下 示例 Lexer规则定义令牌类型。它们的名称必须以大写字母开头,以区别于解析器规则。 基本语法: 语法 含义 A 匹配名称为lexer的规则或片段 A A B 比赛A之后B (A|B) 匹配A或B 'text' 匹配文字“文本” A? 匹配A零或一次 A* 匹配A零次或多次 A+ 匹配A一次或多

  • 问题内容: 这是Antlr中的词法分析器(很长的文件很抱歉): JDK 1.6表示并且无法编译。为什么以及如何解决问题? 问题答案: 实际上,我不会说这是一个很大的语法,并且一定有一个原因导致它不能生成合理大小的代码。 我认为问题与该规则直接相关: 您是否有任何特定的原因想要将QUOTED部分作为单独的标记,而不是像Bart一样将其与引号结合使用呢?这也会使变量过时。 删除QUOTE并将QUOTE

  • 问题内容: ANTLR中的“semantic predicate”是什么? 问题答案: ANTLR 4 对于ANTLR 4中的谓词,请检查以下堆栈溢出的问答: Antlr4中语义谓词的语法 ANTLR4中的语义谓词? ANTLR 3 甲语义谓词是执行在使用时的明码语法操作的额外(语义)规则的方法。 语义谓词有3种类型: 验证语义谓词; 门控语义谓词; 歧义语义谓词。 语法范例 假设您有一小段文字,

  • 问题内容: 我正在阅读有关ConcurrentModificationException以及如何避免它的信息。找到了一篇文章。该文章中的第一个清单具有与以下相似的代码,这显然会导致异常: 然后,它继续以各种建议解释如何解决该问题。 当我尝试重现它时,我没有遇到异常! 为什么我没有得到例外? 问题答案: 根据JavaAPI文档,Iterator.hasNext不会抛出。 检查后,您从列表中删除了一个

  • 在令牌冲突的情况下,如何定义ANTLR lexer行为?让我解释一下“冲突”标记的含义。例如,假设定义了以下内容: 这里有一个冲突,因为在读取一系列数字后,lexer将不知道是有一个INT还是多个INT\u阶段标记(或两者的不同组合)。测试之后,如果INT是在INT\u阶段之后定义的,那么lexer会更喜欢查找INT\u阶段,但可能不是INT?否则,将找不到INT\u阶段。 另一个例子是: 我被告