先说说我们打算干什么,表达式是几乎所有高级编程语言中,都会出现的重要组成部分。因此,如何准确的理解一个表达式,可以说是各种不同的语言所共同面临的问题。表达式千变万化,真正要想正确解释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
具体的解释明天再说,今天先到这里。
(未完待续)
分享到:
相关推荐
用antlr分析处理布尔表达式的例子,包括:语法定义.g文件;生成的词法分析和语法分析器;带有图形界面的分析器调用代码。 其中带有GUI的分析器ParserFrame,可以用于任何.g文件生成的词法、语法分析器,只要通过改变...
NULL 博文链接:https://appofis.iteye.com/blog/743714
本文首先对信号表达式进行了分析,通过ANTLR 实现了对信号表达式的解析。并 加强了表达式的形式,在表达式中增加了变量,使其可以计算出变量在某个区间内的表达式 的值。
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源...
在开始学习ANTLR时,我发现国内有关ANTLR的资料较为贫乏,这催生了我翻译本书的念头。我期望通过本书的翻译,让更多的开发者能够更加自如地解决职业生涯中碰到的难题。 本书没有冗长的理论,而是从一些具体的需求...
antlr实现四则运算源码及其相关配置资料和jar包,基本实现了简单的四则运算
The Definitive ANTLR4Reference 学习笔记 The Definitive ANTLR4Reference 学习笔记
The+Definitive+ANTLR+4+Reference 学习笔记word The+Definitive+ANTLR+4+Reference 学习笔记word
对ANTLR的支持——源代码图。编辑ANTLR语法文件时,“语法图”窗口显示当前规则的直观表示。此功能提供语法元素的自然表示,并且是提供自定义功能以增强特定语言的特征的示例。另外,双击源代码图中的元素将立即跳转...
antlr-2.7.6rc1.jar
赠送jar包:antlr4-runtime-4.2.jar; 赠送原API文档:antlr4-runtime-4.2-javadoc.jar; 赠送源代码:antlr4-runtime-4.2-sources.jar; 赠送Maven依赖信息文件:antlr4-runtime-4.2.pom; 包含翻译后的API文档:...
antlr 2.7.7源码,下载自:http://repo.spring.io/plugins-release/org/antlr/com.springsource.antlr/2.7.7/
ANTLR 1989-2006 Developed by Terence Parr @ University of San Francisco We reserve no legal rights to the ANTLR--it is fully in the public domain. An individual or company may do whatever they ...
antlr3最好的学习文档 antlr3详细说明手册
antlr-2.7.7.jar和antlr-2.7.6.jar
开源项目-antlr-antlr4.zip,antlr 4.6发布,支持go代码生成
赠送jar包:antlr4-runtime-4.7.jar; 赠送原API文档:antlr4-runtime-4.7-javadoc.jar; 赠送源代码:antlr4-runtime-4.7-sources.jar; 赠送Maven依赖信息文件:antlr4-runtime-4.7.pom; 包含翻译后的API文档:...