`
庄表伟
  • 浏览: 1150348 次
  • 性别: 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的信号表达式解析

    例如,在表达式 1+1 中,整数和加号便是需要识别的tokens。词法分析阶段负责过滤掉无意义的字符序列,确保后续解析工作基于正确的输入进行。 接着是语法分析阶段,该阶段检查经过词法分析的输入(token流)是否符合...

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

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

    antlr实例-表达式求值

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

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

    Antlr入门介绍小demo

    1. 递归支持:ANTLR 支持递归,而正则表达式不支持递归。 2. 可扩展性:ANTLR 支持多种语言,适合产品语言的迭代,而正则表达式不易扩展。 3. 广泛应用:ANTLR 支持多种语言,包括 Java、C#、Python、JavaScript、Go...

    The Definitive ANTLR4Reference 学习笔记

    学习ANTLR 4的参考手册时,首先需要了解的是语言、语法、解析树、词法单元和解析器的基本概念。语言由一系列有效句子组成,每个句子包含短语,而短语又由子短语组成。语法是语言的语法规则的正式定义,它指定了子...

    Antlr4 C++ 计算器

    总之,"Antlr4 C++ 计算器"是一个学习ANTLR4和语言解析技术的好起点,它展示了如何使用ANTLR4生成的解析器和词法分析器在C++环境中解析和执行数学表达式。通过深入理解和实践这个项目,你可以提升对编译原理和语言...

    antlr-2.7.7.jar.zip

    这个"antlr-2.7.7.jar.zip"文件是ANTLR的一个特定版本——2.7.7的Java版本,包含ANTLR库的jar文件。 ANTLR的工作原理基于上下文无关语法(Context-Free Grammar,CFG),它可以解析符合给定语法的输入,并生成抽象...

    Java编程艺术-表达式解析器.rar

    本话题聚焦于Java编程艺术中的一个关键环节——表达式解析器,它允许我们处理和求值数学或逻辑表达式。在给定的“Java编程艺术-表达式解析器.rar”压缩包文件中,我们可以深入学习如何在Java中构建这样一个工具,以...

    ANTLR

    1. **ANTLR的基本概念**:讲解ANTLR的基本组成和工作原理,包括如何定义语法规则、如何生成解析器和词法分析器。 2. **ANTLR的安装与配置**:介绍如何在不同的开发环境中安装ANTLR库,如在Java、Python等环境下的...

    antlr实现的计算器

    在这个“ANTLR简易计算器”项目中,Expr可能是ANTLR语法文件中的一个主要规则,代表一个完整的表达式。在解析过程中,ANTLR会递归地处理这个规则,直到所有子表达式都被处理并构建出完整的AST。 ANTLR的灵活性使得...

    antlr-2.7.7.jar

    ANTLR使用正则表达式定义词法规则,并通过上下文无关文法(Context-Free Grammar, CFG)来描述语法规则。这些规则在ANTLR的配置文件(通常以.g或.gram为扩展名)中定义。 ANTLR-2.7.7.jar 是ANTLR 2.7.7版本的Java...

    编译原理学习框架antlr4

    在编译原理的学习中,ANTLR4扮演了核心角色。编译器是将高级语言转换为机器语言的程序,这一过程分为词法分析、语法分析、语义分析和代码生成四个主要阶段。ANTLR4主要用于语法分析阶段,它通过解析源代码的语法结构...

    antlr 例子集 v3版

    1. 基本的算术表达式解析:展示如何解析加减乘除等运算符。 2. 条件语句:如if-else、switch-case等,演示如何处理逻辑控制结构。 3. 循环语句:如for、while等,展示循环的解析方法。 4. 函数调用:如何识别和解析...

    java Antlr 4 语法文件合集

    1. **语法规则(Grammar Rules)**:Antlr 4 语法文件中,语法规则是以 EBNF(扩展巴科斯范式)形式定义的,它允许你声明一系列可能的输入序列。例如,`expr : term ( '+' term )* ;` 这个规则定义了一个简单的算术...

    antlr.jar.zip

    描述"antlr.jar"直接指出了这个压缩包解压后的主要内容——ANTLR的Java实现,即一个名为"antlr.jar"的文件。这个JAR文件包含了ANTLR解析器生成器的全部Java代码,开发者可以将其引入到Java项目中,利用ANTLR的能力来...

    编译原理课程设计有关antlr的词法分析和语法分析

    例如,对于一个简单的计算器,ANTLR的文法文件(calc.g)会定义表达式(Expr)、乘法表达式(mexpr)和原子(atom)等规则。词法分析器(CalcLexer)则负责识别并处理输入中的各种符号,如数字(INT)、加号(PLUS)...

    antlr 五分钟入门

    1. **ANTLR简介**:简述ANTLR的基本概念,如解析器、词法分析器的作用,以及ANTLR在软件开发中的应用。 2. **安装ANTLR**:指导读者如何下载ANTLR库,如antlr-3.2.jar,并将其添加到开发环境(例如Java的类路径)中...

Global site tag (gtag.js) - Google Analytics