- 浏览: 340213 次
- 性别:
- 来自: 大西洋底
文章分类
最新评论
-
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 234package com.test.filestool; ... -
盒子里面另一个是红球的概率问题
2019-05-08 09:27 716问题如下:引用有三个盒子,其中一个里面是两个红球,一个里面是两 ... -
Mac OS X 下运行Java standalone 连接 Notes
2017-11-27 12:32 756Mac OS X 下运行Java standalone 连接 ... -
随机密码生成
2015-09-10 10:19 752import java.util.Random; p ... -
Java 处理mail subject
2015-06-15 21:16 1049对于mail subject 前面烦人的各种Re: 或Fw: ... -
有趣的“生命游戏”
2013-04-04 10:56 1012“生命游戏” 本世纪70年代,人们曾疯魔一种被称作“生命游戏” ... -
有趣的统计英文单词频率的例子
2013-03-02 00:22 1930统计一篇英文文档或一本小说中单词出现的次数,下面代码使用的是英 ... -
有趣的统计英文字母频率的例子
2013-03-01 01:13 1337统计的是英文版"悲惨世界",代码如下,使用 ... -
有趣的将一个十进制整数转换成二进制输出的算法
2013-02-27 00:20 1318原题是将一个十进制整数转换成二进制输出。 分析:任何数可以表 ... -
统一批量修改照片名字
2012-09-01 14:00 2893在给小宝拍的照片中,有我手机拍的,有媳妇手机拍的,还有相机拍的 ... -
关于Java的UUID
2012-08-30 18:40 8285UUID或者UNID或者UID,是一个统一唯一标识,可以用来标 ... -
关于Java中的哈希表 HashMap,Hashtable 等
2012-07-27 10:10 2759首先来了解一下基本概念 所谓哈希表(Hash Table,又 ... -
关于Java中的哈希表
2012-07-27 10:01 1关于Java中的哈希表首先 ... -
关于Java的“浅拷贝”和“深拷贝” (clone method)
2012-07-24 14:31 1272这是关于Java的clone, 一些知道的和不知道的。 1. ... -
从某网站下载MP3的例子
2012-05-29 23:14 1359从某网站下载MP3的例子。为安全起见,将网站信息匿了。 ... -
统计项目中Java文件数和Java代码行数
2010-12-25 11:51 6446其实就是使用递归遍历目录下所有文件 import jav ... -
Java循环内goto语句的替代方案
2010-12-12 23:04 3217众所周知,Java虚拟机根本没有实现goto关键字。我的一个函 ... -
Struts 2 + Spring 2 + JPA + AJAX示例
2009-09-12 21:18 2551这个例子其实就是来自Struts 2的文档,但是原例子针对的是 ... -
Java线程编程学习笔记(二)
2009-06-11 17:23 1287这里是上一篇:Java线程编程学习笔记(一) Java线程编 ... -
Java线程编程学习笔记(一)
2009-04-09 10:46 2159"Java Thread Programming&q ...
相关推荐
实验题目: 基于栈的算术表达式求值算法 实验环境: 学习完了数据结构第三章内容栈和队列 实验目的: 1.掌握栈的定义及实现; 2.掌握利用栈求解算术表达式的方法。 实验内容: 通过修改完善教材中的算法...
算术表达式求值算术表达式求值算术表达式求值算术表达式求值
采用栈的数据结构编写算术表达式求值,定义了字符栈和数据栈
该程序很好实现了算术表达式求值,支持+、-、*、/,以=结束,符合正常表达式。
数据结构的算术表达式求值,能计算正实数的基本运算,并有相应的纠错功能
算术表达式求值:一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符,如:引入表达式...
1.通过修改完善课件案例 3.3 的算法,利用栈来实现算术表达式求值的算法。对算法中调 用的几个函数要给出其实现过程: (1) 函数 In(c):判断 c 是否为运算符; (2) 函数 Precede(t1,t2):判断运算符 t1 和 t2 的...
此算术表达式求值是利用c语言实现,网上有很多这样的程序,但是他们所说的思路与实现全都不一样。本例的思想方法是利用栈进行操作,设有两个栈,一个符号,一个数字栈!用户输入算术表达式后,对其进行解析,经将...
用c语言做的算术表达式求值
java 算术表达式求值器 java 算术表达式求值器
带反编译器,各种java算术表达式求值.包括开源的和网友开发的
算术表达式求值演示 大学时候的实验 自己做的 绝对清晰可用
设计一个程序,演示用算符优先法对算术表达式求值的过程。 2、基本要求:(设计阶段,概要设计和详细设计) 以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用教科书表3.1给出的算符优先关系,...
设计一个程序,演示用算符优先法对算术表达式求值的过程。 基本要求:以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用教科书表3.1给出的算符优先关系,实现对算术四则混合运算表达式的求值,并...
数据结构的算术表达式求值演示 源代码。 数据结构的算术表达式求值演示 源代码。