今天咱们来一句一句的解释一下这个expression.g文件。还是从最简单的几行开始:
class ExpressionLexer extends Lexer; //这是用来声明一个词法分析器,名字叫
//ExpressionLexer
PLUS : '+' ; //加号
MINUS : '-' ; //减号
MUL : '*' ; //乘号
DIV : '/' ; //除号
MOD : '%' ; //求余
POW : '^' ; //开方
SEMI : ';' ; //结束号
//上面这些都太简单了,简直就不需要说明
protected DIGIT : '0'..'9' ; //数字,这是一个受保护的单词,只能被
//词法分析器内部使用
INT : (DIGIT)+ ; //出现了一次以上的数字的词,就是整数,
//它通过受保护的单词:“数字”来定义自己。
//如果DIGIT不是被保护的单词,则词法分析器就会
//无法分辨究竟是数字还是整数了
接下来看语法分析器的代码:
class ExpressionParser extends Parser; //定义一个语法分析器,名字叫ExpressionParser
options { buildAST=true; } //告诉ANTLR,要帮我生成一个抽象语法树,
//留着以后有用
//接下来的部分就非常复杂了,主要是多出来了两个特殊的符号“!”、“^”
//这两个符号,不是EBNF原有的,而是ANTLR为了生成AST而增加的符号
//“!”,是告诉AST生成程序,不要把自己算进去
//“^”,是告诉AST生成程序,把这个符号,放在一颗树的根部,或者一颗子树的根部
//另外,“*”表示出现0次以上,“+”表示出现一次以上,“?”表示出现0或1次
expr : sumExpr SEMI!; //“;”作为结束符,不放入AST
sumExpr : prodExpr ((PLUS^|MINUS^) prodExpr)* ; //“+”“-”作为计算符号
//放在树的顶部
prodExpr : powExpr ((MUL^|DIV^|MOD^) powExpr)* ; //剩下的就不解释了,都能明白的
powExpr : atom (POW^ atom)? ;
atom : INT ;
再来看AST计算器的代码。这“AST计算器”是我起的名字,也就是通过对一个生成的抽象语法树,递归求值,得到最后的结果。
{import java.lang.Math;} //ExpressionTreeWalker要用到的
class ExpressionTreeWalker extends TreeParser; //声明一个树计算器
expr returns [double r] //有一个方法叫expr
//它的返回值是double类型
{double a,b; r=0; } //嵌入的代码,后面要用到
: #(PLUS a=expr b=expr) { r=a+b; } //以下就是计算各种算符,不用多说了
| #(MINUS a=expr b=expr) { r=a-b; }
| #(MUL a=expr b=expr) { r=a*b; }
| #(DIV a=expr b=expr) { r=a/b; }
| #(MOD a=expr b=expr) { r=a%b; }
| #(POW a=expr b=expr) { r=Math.pow(a,b); }
| i:INT { r=(double)Integer.parseInt(i.getText()); }
;
(未完待续)
分享到:
相关推荐
但是,当遇到更复杂的表达式,如 y(t)=3sin(2t+5t^2) 时,传统的表达式形式无法满足需求,必须构造新的表达式形式或重新编写模拟程序来适应特定信号的表达式。 本文提出的解决方案是通过ANTLR实现了信号表达式的...
用antlr分析处理布尔表达式的例子,包括:语法定义.g文件;生成的词法分析和语法分析器;带有图形界面的分析器调用代码。 其中带有GUI的分析器ParserFrame,可以用于任何.g文件生成的词法、语法分析器,只要通过改变...
NULL 博文链接:https://appofis.iteye.com/blog/743714
2. 可扩展性:ANTLR 支持多种语言,适合产品语言的迭代,而正则表达式不易扩展。 3. 广泛应用:ANTLR 支持多种语言,包括 Java、C#、Python、JavaScript、Go、C++、Swift、PHP、Dart 等。 与 GraphQL 的比较 ANTLR...
学习ANTLR 4的参考手册时,首先需要了解的是语言、语法、解析树、词法单元和解析器的基本概念。语言由一系列有效句子组成,每个句子包含短语,而短语又由子短语组成。语法是语言的语法规则的正式定义,它指定了子...
总之,"Antlr4 C++ 计算器"是一个学习ANTLR4和语言解析技术的好起点,它展示了如何使用ANTLR4生成的解析器和词法分析器在C++环境中解析和执行数学表达式。通过深入理解和实践这个项目,你可以提升对编译原理和语言...
这个"antlr-2.7.7.jar.zip"文件是ANTLR的一个特定版本——2.7.7的Java版本,包含ANTLR库的jar文件。 ANTLR的工作原理基于上下文无关语法(Context-Free Grammar,CFG),它可以解析符合给定语法的输入,并生成抽象...
2. **语法分析**:接下来,解析器会根据预定的语法规则(如Bison或ANTLR)将这些标记组合成语法结构,如表达式树。例如,"(100 – 5)"会被解析为一个二元运算表达式,其中100是左操作数,"–"是运算符,5是右操作数...
2. **语法规则**:定义表达式的结构,如加减乘除的运算顺序,以及如何组合这些运算符和操作数来形成有效的计算表达式。 在完成ANTLR语法文件的编写后,我们可以使用ANTLR工具将其编译成解析器和词法分析器的源代码...
2. **ANTLR的安装与配置**:介绍如何在不同的开发环境中安装ANTLR库,如在Java、Python等环境下的设置步骤。 3. **语法规则定义**:详细解释ANTLR语法文件的结构,如如何定义关键字、标识符、运算符等词法单元,...
ANTLR使用正则表达式定义词法规则,并通过上下文无关文法(Context-Free Grammar, CFG)来描述语法规则。这些规则在ANTLR的配置文件(通常以.g或.gram为扩展名)中定义。 ANTLR-2.7.7.jar 是ANTLR 2.7.7版本的Java...
在编译原理的学习中,ANTLR4扮演了核心角色。编译器是将高级语言转换为机器语言的程序,这一过程分为词法分析、语法分析、语义分析和代码生成四个主要阶段。ANTLR4主要用于语法分析阶段,它通过解析源代码的语法结构...
Java Antlr 4 是一个...开发者可以通过研究这些示例,学习如何定义和使用 Antlr 4 语法,从而创建自己的语言解析工具或进行语言分析任务。同时,这个资源也可以作为参考,帮助解决在使用 Antlr 4 过程中遇到的问题。
描述"antlr.jar"直接指出了这个压缩包解压后的主要内容——ANTLR的Java实现,即一个名为"antlr.jar"的文件。这个JAR文件包含了ANTLR解析器生成器的全部Java代码,开发者可以将其引入到Java项目中,利用ANTLR的能力来...
例如,对于一个简单的计算器,ANTLR的文法文件(calc.g)会定义表达式(Expr)、乘法表达式(mexpr)和原子(atom)等规则。词法分析器(CalcLexer)则负责识别并处理输入中的各种符号,如数字(INT)、加号(PLUS)...
2. **安装ANTLR**:指导读者如何下载ANTLR库,如antlr-3.2.jar,并将其添加到开发环境(例如Java的类路径)中。 3. **创建语法文件(Grammar File)**:ANTLR使用扩展名为.g的文件来定义语言的语法规则。Age.g可能...
2. **自动错误恢复**:ANTLR 4具有内置的错误恢复机制,当输入不匹配预期的语法时,它可以尝试恢复解析,继续处理剩余输入,而不是立即停止。 3. **LL(*)和预测LL(*)解析**:ANTLR 4使用预测LL(*)算法,这是一个...
通过这些示例,学习者可以理解ANTLR的工作原理,掌握如何定义语法规则,编写词法分析器和解析器,以及如何生成目标代码。这些实例是学习ANTLR的宝贵资源,帮助开发者快速上手并应用于实际项目中。