先说说我们打算干什么,表达式是几乎所有高级编程语言中,都会出现的重要组成部分。因此,如何准确的理解一个表达式,可以说是各种不同的语言所共同面临的问题。表达式千变万化,真正要想正确解释C/C++那样的复杂表达式,是非常困难的,我们这里只从最简单的表达式做起。
假设一个表达式中,只有常量,没有变量。所有的运算只有:“+”、“-”、“*”、“/”、“^”、“%”六种,而且没有括号,只有整数,没有小数。就这么简单,要解释这样的表达式,我们如果要想自己写个程序来解释,只怕也是非常麻烦的吧。当年我就自己搞过一次,我的本专业不是计算机系,所有也没有学过任何编译原理的东西,Lex呀、Yacc呀、Antlr呀,一概没有听说过,就一股子劲自己去搞。我的办法现在想想也挺简单的,一个表达式,要么是数字,要么是运算符,我就规定死了,中间一律用一个空格分割开来,这样就不需要词法分析了
然后再自己编程序,硬写递归计算(当时连前缀表达式都没听说过),那个苦啊。
现在有了ANTLR,我们只需要将定义写清楚,程序就会自动帮我们生成了。可以先下载一个人家现成的文件来看看:
expression.g,然后再antlr expression.g生成一堆java文件。
接下来的步骤和前面的也差不多,建一个Main.java,
import java.io.*; import antlr.CommonAST; import antlr.collections.AST; import antlr.debug.misc.ASTFrame; public class Main { public static void main(String args[]) { try { DataInputStream input = new DataInputStream(System.in);
ExpressionLexer lexer = new ExpressionLexer(input);
ExpressionParser parser = new ExpressionParser(lexer); parser.expr();
CommonAST parseTree = (CommonAST)parser.getAST(); System.out.println(parseTree.toStringList()); ASTFrame frame = new ASTFrame("The tree", parseTree); frame.setVisible(true);
ExpressionTreeWalker walker = new ExpressionTreeWalker(); double r = walker.expr(parseTree); System.out.println("Value: "+r); } catch(Exception e) { System.err.println("Exception: "+e); } } } |
执行这个Main.class,输入个表达式给它试一试,比如: 1+2-3*4/5^6;系统应该就能给出正确的答案了:
( - ( + 1 2 ) ( / ( * 3 4 ) ( ^ 5 6 ) ) ) ;
Value: 2.999232
具体的解释明天再说,今天先到这里。
(未完待续)
分享到:
相关推荐
例如,在表达式 1+1 中,整数和加号便是需要识别的tokens。词法分析阶段负责过滤掉无意义的字符序列,确保后续解析工作基于正确的输入进行。 接着是语法分析阶段,该阶段检查经过词法分析的输入(token流)是否符合...
用antlr分析处理布尔表达式的例子,包括:语法定义.g文件;生成的词法分析和语法分析器;带有图形界面的分析器调用代码。 其中带有GUI的分析器ParserFrame,可以用于任何.g文件生成的词法、语法分析器,只要通过改变...
NULL 博文链接:https://appofis.iteye.com/blog/743714
JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源...
1. 递归支持:ANTLR 支持递归,而正则表达式不支持递归。 2. 可扩展性:ANTLR 支持多种语言,适合产品语言的迭代,而正则表达式不易扩展。 3. 广泛应用:ANTLR 支持多种语言,包括 Java、C#、Python、JavaScript、Go...
学习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),它可以解析符合给定语法的输入,并生成抽象...
本话题聚焦于Java编程艺术中的一个关键环节——表达式解析器,它允许我们处理和求值数学或逻辑表达式。在给定的“Java编程艺术-表达式解析器.rar”压缩包文件中,我们可以深入学习如何在Java中构建这样一个工具,以...
1. **ANTLR的基本概念**:讲解ANTLR的基本组成和工作原理,包括如何定义语法规则、如何生成解析器和词法分析器。 2. **ANTLR的安装与配置**:介绍如何在不同的开发环境中安装ANTLR库,如在Java、Python等环境下的...
在这个“ANTLR简易计算器”项目中,Expr可能是ANTLR语法文件中的一个主要规则,代表一个完整的表达式。在解析过程中,ANTLR会递归地处理这个规则,直到所有子表达式都被处理并构建出完整的AST。 ANTLR的灵活性使得...
ANTLR使用正则表达式定义词法规则,并通过上下文无关文法(Context-Free Grammar, CFG)来描述语法规则。这些规则在ANTLR的配置文件(通常以.g或.gram为扩展名)中定义。 ANTLR-2.7.7.jar 是ANTLR 2.7.7版本的Java...
在编译原理的学习中,ANTLR4扮演了核心角色。编译器是将高级语言转换为机器语言的程序,这一过程分为词法分析、语法分析、语义分析和代码生成四个主要阶段。ANTLR4主要用于语法分析阶段,它通过解析源代码的语法结构...
1. 基本的算术表达式解析:展示如何解析加减乘除等运算符。 2. 条件语句:如if-else、switch-case等,演示如何处理逻辑控制结构。 3. 循环语句:如for、while等,展示循环的解析方法。 4. 函数调用:如何识别和解析...
1. **语法规则(Grammar Rules)**:Antlr 4 语法文件中,语法规则是以 EBNF(扩展巴科斯范式)形式定义的,它允许你声明一系列可能的输入序列。例如,`expr : term ( '+' term )* ;` 这个规则定义了一个简单的算术...
描述"antlr.jar"直接指出了这个压缩包解压后的主要内容——ANTLR的Java实现,即一个名为"antlr.jar"的文件。这个JAR文件包含了ANTLR解析器生成器的全部Java代码,开发者可以将其引入到Java项目中,利用ANTLR的能力来...
例如,对于一个简单的计算器,ANTLR的文法文件(calc.g)会定义表达式(Expr)、乘法表达式(mexpr)和原子(atom)等规则。词法分析器(CalcLexer)则负责识别并处理输入中的各种符号,如数字(INT)、加号(PLUS)...
1. **ANTLR简介**:简述ANTLR的基本概念,如解析器、词法分析器的作用,以及ANTLR在软件开发中的应用。 2. **安装ANTLR**:指导读者如何下载ANTLR库,如antlr-3.2.jar,并将其添加到开发环境(例如Java的类路径)中...