- 浏览: 344618 次
- 性别:
- 来自: 大西洋底
文章分类
最新评论
-
jfztaq:
问题果然解决了,太感谢了
Chrome经常性的“喔唷,崩溃了”问题 -
saintor:
因为不是每个subclass都执行Cloneable吧。
Java Object类的方法们 -
337240552:
写的不错 这个东西晕死一堆人。
对JavaScript中原型的理解 -
liang86liang:
jkleeo 写道很深奥啊.
C/CPP只有在大学的时候听说过 ...
Windows下用Eclipse搭建C/C++开发环境 -
ahong520:
看来你也是四国军棋爱好者,啥时候切磋一下
四国军棋游戏V0.3.5(未完成)
词法分析
语法分析和翻译
package compile; /** * 词法分析:返回数字和操作符号的序列 * @author metaphy * 2007-6-14 */ public class Lexer { public static final String EOS = " " ; /*token之间的分隔符*/ public static final String DONE ="=" ; /*token结束的标记*/ private StringBuffer tokens = new StringBuffer(); private String expression = null; public Lexer(String expression) { super(); this.expression = expression; } /*判断在是否数字*/ private boolean isDigit(char c){ return c>='0' && c<='9' ; } /*判断是否操作符*/ private boolean isOperator(char c){ return c=='+' ||c=='-' ||c=='*' ||c=='/'|| c=='('|| c==')' ||c=='%' || c=='^'; } /*判断是否字母*/ private boolean isAlpha(char c){ return c>='a' && c<= 'z' || c>='A' && c<='Z' ; } /*以EOS为分隔符将单词分隔*/ public String lexan(){ String str ="" ; /*数字序列*/ for (int i=0 ;i< expression.length(); i++){ char ch = expression.charAt(i) ; if( (isOperator(ch) || isAlpha(ch)) && !str.equals("")){ tokens.append(str.trim()) ; tokens.append(EOS) ; str="" ; } if(ch ==' ' || ch== '\t'){ ; }else if(isDigit(ch)){ //数字 if (!(str.equals("") && ch=='0')){ str += String.valueOf(ch) ; } }else if(isOperator(ch)){ //操作符 str = "" ; tokens.append(ch) ; tokens.append(EOS) ; }else{ //其他符号未处理 } if((i==expression.length() -1) && !str.trim().equals("")) { tokens.append(str.trim()) ; tokens.append(EOS) ; } } tokens.append(DONE) ; return tokens.toString().trim(); } }
语法分析和翻译
package compile; import java.util.ArrayList; import java.util.Stack; /** * 语法分析和翻译:算术表达式求值。非负整数的加、减、乘、除、取模和幂操作, * 优先级顺序为:幂=>乘、除、模=>加、减,同级求值顺序从左向右,小括号可以改变优先级。 * BNF定义: * digit -> 0|1|2|3|4|5|6|7|8|9|digit * factor -> digit | ( exp ) * power -> factor | power ^ factor * term -> power | term * power | term / power | term % power * exp -> term | exp + term | exp - term * * @author metaphy * 2007-6-14 */ public class Parser { // String s = "2 000*(33%10)+ 12/ (9-3) * (6-2+ 11) + 2^3 " ; // String s = " 3 3 * (008 % 6)" ; // String s = "1+1"; // String s = "3^(1+1)"; String s = "(100-95)*3^(1+1)"; private Lexer lex = new Lexer(s) ; private ArrayList tokenList ; private String lookahead; private int pointer ; Stack stack = new Stack() ; //后缀表达式计算堆栈 private void init(){ tokenList = new ArrayList() ; String tokenString = lex.lexan() ; System.out.print (tokenString); String[] strs = tokenString.split(Lexer.EOS) ; lookahead = strs[0].trim() ; pointer = 0 ; for (int i=0 ;i< strs.length; i++){ if(strs[i]==null) { error(); return ; } tokenList.add(strs[i].trim()); } } /*判断在是否整数*/ private boolean isDigit(String str){ try{ Long.parseLong(str); return true ; }catch(Exception e){ return false ; } } /*往下匹配*/ private void matchNext(String t){ if(lookahead.equals(t)){ pointer ++ ; lookahead = (String)tokenList.get(pointer) ; }else { error() ; } } /*出错信息*/ private void error(){ System.out.println("error occurs, current obj: "+ lookahead); System.exit(1) ; } /*因子:带小括号表达式或数字,第1优先级*/ private void factor(){ if(lookahead.equals("(")){ matchNext("(") ; expr() ; matchNext(")") ; }else if(isDigit(lookahead)){ emit(lookahead) ; matchNext(lookahead) ; }else { error() ; } } /*乘幂操作,第2优先级*/ private void power(){ factor(); while(true){ if(lookahead.equals("^")){ String tmp = lookahead ; matchNext(lookahead) ; factor() ; emit(tmp) ; continue ; }else{ return ; } } } /*乘、除、取模操作*/ private void term(){ power(); while(true){ if(lookahead.equals("*")||lookahead.equals("/")||lookahead.equals("%")){ String tmp = lookahead; matchNext(lookahead) ; power(); emit(tmp) ; continue ; }else{ return ; } } } /*表达式:term的+ - 操作*/ private void expr(){ term() ; while(true){ if(lookahead.equals("+")||lookahead.equals("-")){ String tmp = lookahead ; matchNext(lookahead); term(); emit(tmp) ; continue ; }else{ return ; } } } /*生成后缀表达式,利用堆栈计算*/ private void emit(String some){ // System.out.println (some) ; if(isDigit(some)){ stack.push(some) ; }else{ long right =Long.parseLong((String) stack.pop()) ; long left =Long.parseLong((String) stack.pop()) ; long result =1 ; if(some.equals("+")){ result = left + right; }else if(some.equals("-")){ result = left - right; }else if(some.equals("*")){ result = left * right; }else if(some.equals("/")){ try{ result = left / right; }catch(Exception e){ System.err.println("除以0错误") ; error() ; } }else if(some.equals("%")){ result = left % right; }else if(some.equals("^")){ for(int j = 1 ;j<= right ;j ++) result *= left ; }else{ } stack.push(String.valueOf(result)); } } private String getValue (){ if (stack==null || stack.firstElement() ==null ){ error (); } return (String)stack.pop() ; } /*begin*/ private void parse(){ while(! lookahead.equals(Lexer.DONE)){ expr(); } } /** * @param args */ public static void main(String[] args) { Parser parser = new Parser() ; parser.init(); parser.parse(); System.out.println(parser.getValue()) ; } } 运行结果: ( 100 - 95 ) * 3 ^ ( 1 + 1 ) =45
发表评论
-
文件分割与合并
2020-03-19 20:59 262package com.test.filestool; ... -
盒子里面另一个是红球的概率问题
2019-05-08 09:27 769问题如下:引用有三个盒子,其中一个里面是两个红球,一个里面是两 ... -
Mac OS X 下运行Java standalone 连接 Notes
2017-11-27 12:32 788Mac OS X 下运行Java standalone 连接 ... -
随机密码生成
2015-09-10 10:19 784import java.util.Random; p ... -
Java 处理mail subject
2015-06-15 21:16 1078对于mail subject 前面烦人的各种Re: 或Fw: ... -
有趣的“生命游戏”
2013-04-04 10:56 1036“生命游戏” 本世纪70年代,人们曾疯魔一种被称作“生命游戏” ... -
有趣的统计英文单词频率的例子
2013-03-02 00:22 1958统计一篇英文文档或一本小说中单词出现的次数,下面代码使用的是英 ... -
有趣的统计英文字母频率的例子
2013-03-01 01:13 1391统计的是英文版"悲惨世界",代码如下,使用 ... -
有趣的将一个十进制整数转换成二进制输出的算法
2013-02-27 00:20 1344原题是将一个十进制整数转换成二进制输出。 分析:任何数可以表 ... -
统一批量修改照片名字
2012-09-01 14:00 2927在给小宝拍的照片中,有我手机拍的,有媳妇手机拍的,还有相机拍的 ... -
关于Java的UUID
2012-08-30 18:40 8317UUID或者UNID或者UID,是一个统一唯一标识,可以用来标 ... -
关于Java中的哈希表 HashMap,Hashtable 等
2012-07-27 10:10 2790首先来了解一下基本概念 所谓哈希表(Hash Table,又 ... -
关于Java中的哈希表
2012-07-27 10:01 1关于Java中的哈希表首先 ... -
关于Java的“浅拷贝”和“深拷贝” (clone method)
2012-07-24 14:31 1297这是关于Java的clone, 一些知道的和不知道的。 1. ... -
从某网站下载MP3的例子
2012-05-29 23:14 1402从某网站下载MP3的例子。为安全起见,将网站信息匿了。 ... -
统计项目中Java文件数和Java代码行数
2010-12-25 11:51 6475其实就是使用递归遍历目录下所有文件 import jav ... -
Java循环内goto语句的替代方案
2010-12-12 23:04 3249众所周知,Java虚拟机根本没有实现goto关键字。我的一个函 ... -
Struts 2 + Spring 2 + JPA + AJAX示例
2009-09-12 21:18 2582这个例子其实就是来自Struts 2的文档,但是原例子针对的是 ... -
Java线程编程学习笔记(二)
2009-06-11 17:23 1331这里是上一篇:Java线程编程学习笔记(一) Java线程编 ... -
Java线程编程学习笔记(一)
2009-04-09 10:46 2195"Java Thread Programming&q ...
相关推荐
栈的应用广泛,其中之一就是用于解决算术表达式的求值问题。本文将深入探讨如何利用栈来实现一个算术表达式求值的程序。 首先,我们要理解算术表达式的构成。一个基本的算术表达式可能包含数字、运算符(如加号"+...
Java算术表达式求值是程序设计中一个常见的任务,特别是在动态计算或用户输入解析的场景下。在Java中,处理这种需求通常涉及到解析和计算字符串形式的数学表达式。这个压缩包文件包含了多种资源,可以帮助我们理解并...
《数据结构算术表达式求值实验报告》 在计算机科学中,算术表达式的求值是一项基础且关键的任务。本实验报告将详细介绍如何利用数据结构来处理和求解不含变量的整数算术表达式。以下是实验的核心知识点: 1. **...
### 设计一个程序,演示用算符优先法对算术表达式求值的过程 #### 一、背景介绍 算术表达式的求值是计算机科学中的一个基础问题,它不仅是编程语言实现的重要组成部分,也是理解数据结构(如栈)的关键应用案例之...
采用栈的数据结构编写算术表达式求值,定义了字符栈和数据栈
在IT领域,算术表达式的求值是一项基础且重要的任务,尤其在编程语言如C和C++中。本文将深入探讨算术表达式求值的原理、方法以及相关的编程实践,以"算术表达式求值演示1"为例,解析其中涉及到的知识点。 首先,...
基于栈的算术表达式求值算法是一种常见的计算方法,主要应用于解决逆波兰表示法(Reverse Polish Notation,RPN)或中缀表达式的求值问题。本实验旨在让学生掌握栈这种数据结构的定义和实现,并能利用栈解决实际问题...
数据结构的算术表达式求值,能计算正实数的基本运算,并有相应的纠错功能
算术表达式求值:一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符,如:引入表达式...
1.通过修改完善课件案例 3.3 的算法,利用栈来实现算术表达式求值的算法。对算法中调 用的几个函数要给出其实现过程: (1) 函数 In(c):判断 c 是否为运算符; (2) 函数 Precede(t1,t2):判断运算符 t1 和 t2 的...
本示例中的“算术表达式求值演示”聚焦于如何利用数据结构来解决计算复杂算术表达式的问题。在这个过程中,我们将探讨栈这一重要的数据结构,以及它是如何在计算过程中起到关键作用的。 栈是一种后进先出(LIFO)的...
### 数据结构实验——算术表达式求值 #### 实验目的 本次实验旨在实现一个能够对包含浮点数的算术表达式进行求值的程序。通过本实验,学生能够进一步掌握栈的基本操作及其在实际问题中的应用,并理解并实现中缀...
本文将深入探讨一个特定的主题——"算术表达式求值",这是数据结构应用的一个实例,主要涉及编译原理、解析器设计以及C++编程语言。 算术表达式求值是指对包含加、减、乘、除等运算符的数学表达式的计算过程。在...
本课程设计报告主要探讨了如何实现一个简单的算术表达式求值系统,该系统能够处理不含变量的、基于字符序列的算术表达式,并按照运算优先级顺序进行运算。以下是详细的知识点说明: 1. **输入与输出**: - 用户...