`
庄表伟
  • 浏览: 1135459 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ANTLR学习心得——表达式(1)

阅读更多
先说说我们打算干什么,表达式是几乎所有高级编程语言中,都会出现的重要组成部分。因此,如何准确的理解一个表达式,可以说是各种不同的语言所共同面临的问题。表达式千变万化,真正要想正确解释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 楼 daly1987 2011-12-13  
不错啊,找到这个帖子学习。

相关推荐

    用Antlr 分析布尔表达式的例子

    用antlr分析处理布尔表达式的例子,包括:语法定义.g文件;生成的词法分析和语法分析器;带有图形界面的分析器调用代码。 其中带有GUI的分析器ParserFrame,可以用于任何.g文件生成的词法、语法分析器,只要通过改变...

    antlr实例-表达式求值

    NULL 博文链接:https://appofis.iteye.com/blog/743714

    基于ANTLR的信号表达式解析

    本文首先对信号表达式进行了分析,通过ANTLR 实现了对信号表达式的解析。并 加强了表达式的形式,在表达式中增加了变量,使其可以计算出变量在某个区间内的表达式 的值。

    JavaEE源代码 antlr-2.7.6rc1

    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源...

    antlr4权威指南

    在开始学习ANTLR时,我发现国内有关ANTLR的资料较为贫乏,这催生了我翻译本书的念头。我期望通过本书的翻译,让更多的开发者能够更加自如地解决职业生涯中碰到的难题。  本书没有冗长的理论,而是从一些具体的需求...

    antlr实现四则运算源码

    antlr实现四则运算源码及其相关配置资料和jar包,基本实现了简单的四则运算

    The Definitive ANTLR4Reference 学习笔记

    The Definitive ANTLR4Reference 学习笔记 The Definitive ANTLR4Reference 学习笔记

    The+Definitive+ANTLR+4+Reference 学习笔记word

    The+Definitive+ANTLR+4+Reference 学习笔记word The+Definitive+ANTLR+4+Reference 学习笔记word

    antlrworks-1.5.1.jar

    对ANTLR的支持——源代码图。编辑ANTLR语法文件时,“语法图”窗口显示当前规则的直观表示。此功能提供语法元素的自然表示,并且是提供自定义功能以增强特定语言的特征的示例。另外,双击源代码图中的元素将立即跳转...

    antlr-2.7.6rc1.jar

    antlr-2.7.6rc1.jar

    antlr4-runtime-4.2-API文档-中文版.zip

    赠送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源码

    antlr 2.7.7源码,下载自:http://repo.spring.io/plugins-release/org/antlr/com.springsource.antlr/2.7.7/

    antlr-2.7.7.tar.gz

    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最好的学习文档 antlr3详细说明手册

    antlr-2.7.7.jar和antlr-2.7.6.jar

    antlr-2.7.7.jar和antlr-2.7.6.jar

    开源项目-antlr-antlr4.zip

    开源项目-antlr-antlr4.zip,antlr 4.6发布,支持go代码生成

    antlr4-runtime-4.7-API文档-中文版.zip

    赠送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文档:...

Global site tag (gtag.js) - Google Analytics