• 大小: 348KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-10-30
  • 语言: Java
  • 标签: 中缀表达  

资源简介

编译原理实验一 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-frame.html
     文件         600  2018-03-15 15:13  实验一\编译与运行脚本\doc\allclasses-noframe.html
     文件        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-frame.html
     文件           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\script.js
     文件       12842  2018-03-15 11:46  实验一\编译与运行脚本\doc\stylesheet.css
     文件        8474  2018-03-15 15:12  实验一\编译与运行脚本\doc\Test.html
............此处省略5个文件信息

评论

共有 条评论