1、句子前有空格符
图1-2
2、综合所有文法的句子
图1-3
3不以#号结束的句子
图1-4
4、加减按从左至右
图1-5
5、先乘后减
图1-6
6、有括号的先算括号里面的
图1-7
7、乘方的优先级大于除法的
图1-8
8、先乘方后乘除
图1-9 9、乘除按从左至右法则
图1-10
10、输入串含有不是指定文法的句子
图1-11
测试人姓名 1 小鸿 测试时间 输入 2012-06-25 输出 错误个数 3 序号 路径 在句子前面输入一个空格符号 实际结果 您输入的表达式(6-3+5^2*2/10)/2#有误 (6-3+5^2*2/10)/2# 4.0 2 3 4 5 6 7 8 9 10 11 12 一个包含所有文法的句子 不以#号结束的句子 先减后加 先加后减 先乘后减 有括号先算括号里面的 乘方的优先级最大 先乘方再从左至右 先除后乘 先乘后除 输入串含有不是指定文法的句子 (6-3+5^2*2/10)/2# 4.0 3+4+5 6-3+2# 3+4-2# 6-3*2# (6-3)*2# 25/5^2# 3*2/6^2# 25/5*2# 3*2/2# {3+2-[2*2-(3-2)]}# 12.0 5.0 5.0 0.0 6.0 1.0 0.1666667 10.0 3.0 2.0 4.0 您输入的表达式3+4+5有误 5.0 5.0 0.0 6.0 1.0 0.1666667 10.0 3.0 您输入的表达式{3+2-[2*2-(3-2)]}#有误 表1-2
六、参考文献:
1、黄贤英,刘贞 ,刘全利;“编译原理”课程的地位及教改思路[J];重庆科技学院学报(社会科学版);2005年03期
2、张素琴,吕映芝,蒋维杜,戴桂兰; 《编译原理》(第二版);清华大学出版社;2009年5月第12次印刷
3、王雷,刘志成,周晶 ;编译原理课程设计; 2005
4、期刊论文 浅谈\编译原理\课程教学 - 广东工业大学学报(社会科学版)2005,5 附加代码:
package com.op.core;
import java.math.BigDecimal; import java.util.Stack;
import com.op.util.StringUtil; import com.op.util.IOUtil;
public class OperatorPriority {
private Stack
private String input; //键盘输入字符串 /***
* 构造函数 * @param input */
public OperatorPriority(String input) { super();
optrStack = new Stack
* 操作两个数
* @param a 操作数1 * @param b 操作数2 * @param op 操作符 * @return 运算结果 */
public float operateTwoNum(float a, float b, char op) { BigDecimal da = new BigDecimal(Float.toString(a)); BigDecimal db = new BigDecimal(Float.toString(b)); switch (op) { case '*':
return da.multiply(db).floatValue(); case '+':
return da.add(db).floatValue(); case '-':
return db.subtract(da).floatValue(); case '/': return db.divide(da,7,BigDecimal.ROUND_HALF_UP).floatValue(); //除不
尽的情况取7位精确值。 case '^':
return db.pow((int)a).floatValue(); }
return 0; } /***
* 判断是否为操作符
* @param ch 被判断字符 * @return 布尔值 */
public boolean isOperator(char ch) {
if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '#'||ch=='^') return true; else
return false; } /***
* 扫描字符串,判断是否对应文法,并计算出结果 * @return 计算结果
* @throws Exception 如果不符合文法,或者除数等于0,都将抛出异常 */
public String scanner() throws Exception { int postion = 0; // 字符串上指示的指针 char operator = 0; // 操作符 float a = 0, b = 0; // 操作数
String[] exp = StringUtil.splitExp(input); while (true) {
// 判断是否为运算符
if (exp[postion].length()==1&&isOperator(exp[postion].charAt(0))) { // 需要进行运算符的比较 if (!optrStack.isEmpty()) {
if (PriorityTable.getPriority(optrStack.peek().charValue(), exp[postion].charAt(0)) == '<') optrStack.push(exp[postion].charAt(0));
else if (PriorityTable.getPriority(optrStack.peek() .charValue(), exp[postion].charAt(0)) == '>') { a = opndStack.pop();