Tag: antlr3

使用antlr3的简单标准表达式解析器

我想用antlr3创建一个简单的条件表达式解析器 更新:单独的AND OR表达式规则以支持AND / OR不同的层次结构,但还有另一个问题:如果表达式类似于:a = 1且b = 2且c = 3根据当前工具,树应如下: = = (a = 1)(b = 2)(c = 3) But I want to generate it as follows: = = (a = 1)(b = 2) (c = 3) First “and” should be higher priority than another, because I want to parse all the expression as […]

生成无效javaexception的ANTLR会抛出代码

这些天我一直在使用ANTLRwork 1.5和antlr runtime 3.5。 这是我发现的一个奇怪的事情:Antlr为我生成这种java代码: public final BLABLABLAParser.addExpression_return addExpression() throws { blablabla… } 请注意,此函数不会抛出任何内容,这在java中无效。 所以我需要手动纠正这些错误。 谁知道为什么? 这里是示例语法,它直接取自书籍语言实现模式 。 // START: header // START: header grammar Cymbol; // my grammar is called Cymbol options { output = AST; ASTLabelType = CommonTree; } tokens{ METHOD_DECL; ARG_DECL; BLOCK; VAR_DECL; CALL; ELIST; EXPR; } // define a SymbolTable field […]

获取Antlr规则的原始文本

我是一名ANTLR初学者,想要计算符号的SHA1-Hash。 我的简化示例语法: grammar Example; method @after{calculateSha1($text); }: ‘call’ ID; ID: ‘A’..’Z’+; WS: (‘ ‘|’\n’|’\r’)+ {skip(); } COMMENT: ‘/*’ (options {greedy=false;}: .)* ‘*/’ {$channel=HIDDEN} 当词法分析器删除所有空格时,不同的字符串call /* DEF */ ABC不幸的是call /* DEF */ ABC获得相同的SHA1-Hash值。 是否有可能在开始和结束标记之间获取规则的“原始”文本以及所有跳过的空格和其他通道的文本? (我想到的一种可能性是成员WS -and COMMENT -lexer规则中的所有字符,但是还有更多规则,所以这不太实用。) 我使用标准的ANTLRInputStream来提供Lexer,但我不知道如何接收原始文本。

Scala解析器组合器与ANTLR / Java生成的解析器?

我正在为一个主要用Scala编写的应用程序编写表达式解析器。 我在Scala中构建了AST对象,现在需要编写解析器。 我听说过Scala的内置解析器组合器,以及ANTLR3,我想知道:哪个可以提供更好的性能和编写代码的简易性? 至今: ANTLR专业人士 知名 快速 外部DSL ANTLRWorks(用于解析器语法调试/测试的优秀IDE) ANTLR缺点 基于Java(Scala互操作可能具有挑战性,任何经验?) 在运行时需要很大的依赖关系 Parser combinator专业人士 Scala的一部分 少一个构建步骤 不需要运行时依赖; 例如,已经包含在Scala的运行时库中 解析器组合器缺点 内部DSL(可能意味着执行速度较慢?) 没有ANTLRWorks(提供很好的解析器测试和可视化function) 有什么想法吗? 编辑:此表达式解析器解析代数/微积分表达式。 它将在最终确定的Android应用程序Magnificalc中使用。

扩展简单的ANTLR语法以支持输入变量

我仍然在寻找一种非常简单的语言 ,现在我知道没有。 所以我自己用ANTLR3写一个。 我在这个答案中找到了一个很好的例子: Exp.g: grammar Exp; eval returns [double value] : exp=additionExp {$value = $exp.value;} ; additionExp returns [double value] : m1=multiplyExp {$value = $m1.value;} ( ‘+’ m2=multiplyExp {$value += $m2.value;} | ‘-‘ m2=multiplyExp {$value -= $m2.value;} )* ; multiplyExp returns [double value] : a1=atomExp {$value = $a1.value;} ( ‘*’ a2=atomExp {$value *= $a2.value;} […]