资源简介
编译原理实验一
1) 实现一个完整的 Java 程序,它读取文件中的中缀表达式(每个表达式以分号结束,文件中可以有多个表达式)并转换为等价的后缀表达式后输出到屏幕上。表达式中的运算量可以是任意整数或者小数,支持加、减、乘、除、取负运算以及小括号,表达式中的空格、制表符等空白符号可以被忽略。若用户输入的表达式有误,则提示用户错误的位置。譬如两个运算量之间缺少运算符、或运算符缺少左(或右)运算量等。错误处理功能的最低要求是当输入表达式有错时,给出一个报错信息,提示错误的位置和类别。学有余力的学生还可考虑尝试如何实现出错恢复(Error Recovery),即当程序发现一个错误时不是立马停下来,而是能够从跌倒的地方爬起来,继续分析下去,从而一次运行即可发现更多的错误。
2)为以上的 Java 程序提供一个随机测试数据发生器(用 Java 语言来写),生成若干随机的正确表达式和不正确表达式(通过命令行参数决定是生成正确的还是不正确的以及生成的数量)。生成的测试数据要求写入文件,可以被 1)中的程序读取
代码片段和文件信息
/**
*20152101033
*裴文君
**/
import java.util.Stack;
import java.util.regex.Pattern;
public class change{
private change() {
}
public static int error(String infix) {
int error=0;
int length = infix.length()+1;
int k=0;
int num=0;
int n=0;
int[] a=new int [length];
for (int i = 0; i < length; i++) {
a[i]=0;
}
for (int i = 0; i < length-1; i++)
{
Character temp;
char c = infix.charAt(i);
switch (c) {
// 忽略空格
case ‘ ‘:
break;
// 碰到‘(‘,push到栈
case ‘(‘:
n++;k++;num=0;
temp=infix.charAt(i+1);
if(temp>=‘0‘&&temp<=‘9‘) n++;
else if(temp!=‘(‘){a[n]=1;}
int p=i+1; Boolean b=false;
while(p {
if(infix.charAt(p)==‘+‘||infix.charAt(p)==‘-‘||infix.charAt(p)==‘*‘||infix.charAt(p)==‘/‘)
{b=true;}
p++;
}
if(!b) {a[n]=2;}
break;
// 碰到‘+‘‘-‘,将栈中所有运算符弹出,送到输出队列中
case ‘+‘:
case ‘-‘:
case ‘*‘:
case ‘/‘:
if(num!=1&&n==0) {a[n]=1;}
n++;
if(i+1>=length-1) a[n]=1;
else
{temp=infix.charAt(i+1);
if(temp>=‘0‘&&temp<=‘9‘) n++;
else if(temp!=‘(‘) {a[n]=1;}
}
num=0;
break;
// 碰到‘*‘‘/‘,将栈中所有乘除运算符弹出,送到输出队列中
// 碰到右括号,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号
case ‘)‘:
n++;k--;
if(i+1 {temp=infix.charAt(i+1);
if(temp>=‘0‘&&temp<=‘9‘||temp==‘(‘) {a[n]=2;}}
num=0;
break;
//如果是数字,直接送至输出序列
default:
if(num==0) num=1;
if(i+1 {temp=infix.charAt(i+1);
if(temp==‘(‘){a[n]=1;}
}
break;
}
}
if(k!=0) {System.out.println(“括号不匹配“);error++;}
for (int i = 0; i < length-1; i++) {
int kk=i+1;
if(a[i]==1)
{
if(i==0)
{System.out.println(“第1个字符前缺少运算量“);error++;}
else
{System.out.println(“第“+kk+“个字符后缺少运算量“);error++;}
}
else if(a[i]==2)
{System.out.println(“第“+kk+“个字符后缺少运算符“);error++;}
}
return error;
}
//方法:中缀表达式转成后缀表达式
public static String infixToSuffix(String infix) {
Stack stack = new Stack();
String suffix = ““;
int length = infix.length();
for (int i = 0; i < length; i++) {
Character temp;
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-04-08 16:15 实验一\
文件 378368 2018-04-08 16:15 实验一\design.doc
文件 0 2018-04-08 16:14 实验一\readme.txt
目录 0 2018-04-08 16:14 实验一\编译与运行脚本\
目录 0 2018-04-08 16:14 实验一\编译与运行脚本\doc\
文件 620 2018-03-15 15:13 实验一\编译与运行脚本\doc\allclasses-fr
文件 600 2018-03-15 15:13 实验一\编译与运行脚本\doc\allclasses-nofr
文件 7875 2018-03-15 15:13 实验一\编译与运行脚本\doc\change.html
目录 0 2018-04-08 16:14 实验一\编译与运行脚本\doc\class-use\
文件 3769 2018-03-15 15:13 实验一\编译与运行脚本\doc\class-use\change.html
文件 3747 2018-03-15 15:12 实验一\编译与运行脚本\doc\class-use\Test.html
文件 3523 2018-03-15 15:13 实验一\编译与运行脚本\doc\constant-values.html
文件 3510 2018-03-15 15:13 实验一\编译与运行脚本\doc\deprecated-list.html
文件 8062 2018-03-15 15:13 实验一\编译与运行脚本\doc\help-doc.html
文件 2696 2018-03-15 15:13 实验一\编译与运行脚本\doc\index.html
目录 0 2018-04-08 16:14 实验一\编译与运行脚本\doc\index-files\
文件 4031 2018-03-15 15:13 实验一\编译与运行脚本\doc\index-files\index-1.html
文件 4113 2018-03-15 15:13 实验一\编译与运行脚本\doc\index-files\index-2.html
文件 4129 2018-03-15 15:13 实验一\编译与运行脚本\doc\index-files\index-3.html
文件 4085 2018-03-15 15:13 实验一\编译与运行脚本\doc\index-files\index-4.html
文件 4506 2018-03-15 15:12 实验一\编译与运行脚本\doc\index-files\index-5.html
文件 4348 2018-03-15 15:12 实验一\编译与运行脚本\doc\index-files\index-6.html
文件 3728 2018-03-15 15:13 实验一\编译与运行脚本\doc\overview-tree.html
文件 724 2018-03-15 15:13 实验一\编译与运行脚本\doc\package-fr
文件 1 2018-03-15 15:13 实验一\编译与运行脚本\doc\package-list
文件 3895 2018-03-15 15:13 实验一\编译与运行脚本\doc\package-summary.html
文件 3735 2018-03-15 15:13 实验一\编译与运行脚本\doc\package-tree.html
文件 3593 2018-03-15 15:13 实验一\编译与运行脚本\doc\package-use.html
文件 827 2018-03-15 15:13 实验一\编译与运行脚本\doc\sc
文件 12842 2018-03-15 11:46 实验一\编译与运行脚本\doc\st
文件 8474 2018-03-15 15:12 实验一\编译与运行脚本\doc\Test.html
............此处省略5个文件信息
评论
共有 条评论