⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 analyse.java

📁 JAVA的CMM编译器(词法+语法+语义+输出结果)
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                    sen.offer("第" +lineNum + "行:while语句,while后请输入正确的条件语句!");
                }
        }else{
            sen.offer("第" + lineNum + "行:while语句出错!");
        }
    }
    
    
    //P-->QP1
    public void expression(){
        if(word[0].equals("(")|| word[1].equals("ID")||word[1].equals("INT")||word[1].equals("REAL")){
            sen.offer("表达式:");
            sen.offer("$");
            item();
            exp_1();
            sen.offer("%");
        }else{
            sen.offer("第" + lineNum + "行:请输入正确的表达式!");
        }
    }
    
    // P1 --> aQP1 | null
    public void exp_1(){
        if(word[0].equals("+")){
            sen.offer(word[0]);
            nextToken();
            item();
            exp_1();
            genDo(InsType.opr,0,1);
        }else if(word[0].equals("-")){
            sen.offer(word[0]);
            nextToken();
            item();
            exp_1();
            genDo(InsType.opr,0,2);
        }else if(!(word[0].equals(";")||word[0].equalsIgnoreCase("else")||word[0].equals("}")||word[0].equals("#")||word[1].equals("LO")||word[0].equals(")")||word[0].equals("]"))){
            sen.offer("第" + lineNum + "行:请输入正确的表达式!");
        }
    }
    
    // Q --> F Q1
    public void item(){
        if(word[0].equals("(")||word[1].equals("ID")||word[1].equals("INT")||word[1].equals("REAL")){
            factor();
            it_1();
        }else{
            sen.offer("第" + lineNum + "行:请输入正确的表达式!");
        }        
    }
    
    // Q1 --> bFQ1 | null
    public void it_1(){
        if(word[0].equals("*")){
            sen.offer(word[0]);
            nextToken();
            factor();
            it_1();
            genDo(InsType.opr,0,3);
        }else if(word[0].equals("/")){
             sen.offer(word[0]);
            nextToken();
            factor();
            it_1();
            genDo(InsType.opr,0,4);
        }else if(!(word[0].equals(";")||word[0].equals("else")||word[0].equals("}")||word[0].equals("#")||word[1].equals("LO")||word[0].equals(")")||word[0].equals("+")||word[0].equals("-")||word[0].equals("]"))){
            sen.offer("第" + lineNum + "行:请输入正确的表达式!");
        }
    }
    
    // F --> (P) | iF1 | x | y
    public void factor(){
        if(word[0].equals("(")){
            sen.offer(word[0]);
            nextToken();
            expression();
            if(word[0].endsWith(")")){
                sen.offer(word[0]);
                nextToken();
            }else{
                sen.offer("第" + lineNum + "行:缺少)!");
            }
        }else if(word[1].equals("ID")){
            sen.offer(word[0]);
            if(isIden(word[0])>=0){
                //判断是否为赋值语句
                if(flag_val==true){
                    if(type == ((Variable)table.get(isIden(word[0]))).getType()){
                        genDo(InsType.lod,0,isIden(word[0]));
                    }else{
                        sen.offer("赋值语句类型不匹配!");
                        flag = true;
                    }
                }else{
                    genDo(InsType.lod,0,isIden(word[0]));
                }                
            }else{
                sen.offer("变量" + word[0] + "未声明!");
                flag = true;
            }
            nextToken();
            factor_1();
        }else if(word[1].equals("INT")){
            sen.offer(word[0]);
            // 判断赋值符号左右类型是否匹配
            if(flag_val == true){                             //判断是否为赋值语句
                if(type == VarType.INT){
                    genDo(InsType.lit,0,Integer.parseInt(word[0]));
                }else if(type == VarType.REAL){
                    sen.offer("赋值语句类型不匹配!");
                    flag  = true;
                }
            }else{
                genDo(InsType.lit,0,Integer.parseInt(word[0]));
            }            
            nextToken();            
        }else if(word[1].equals("REAL")){
            sen.offer(word[0]);
            if(flag_val == true){
                    if(type == VarType.REAL){
                        genDo(InsType.lit,0,Double.parseDouble(word[0]));
                    }else{
                        sen.offer("赋值语句类型不匹配!");
                        flag = true;
                    }
                }else{
                    genDo(InsType.lit,0,Double.parseDouble(word[0]));
                }          
            nextToken();     
            
        }
    }
    
    // F1 --> [x] | [i] | null
    public void factor_1(){
        if(word[0].equals("[")){
            sen.offer(word[0]);
            nextToken();
            if(word[1].equals("INT")){
                sen.offer(word[0]);
                //判断数组是否越界
                int x = ((Instruction)code.getLast()).getA_i();
                if(Integer.parseInt(word[0])<arrSize(x)){
                    genDo(InsType.lit,0,Integer.parseInt(word[0]));
                }else{
                    sen.offer("数组越界!");
                    flag = true;
                }
                nextToken();
                if(word[0].equals("]")){
                    sen.offer(word[0]);
                    nextToken();                    
                }else{
                    sen.offer("第" + lineNum + "行:缺少]!");
                }
            }else if(word[1].equals("ID")){
                sen.offer(word[0]);
                //判断数组下标变量是否声明
                    int x = isIden(word[0]);
                    if(x>=0){
                        // 判断数组下标是否越界
                        int z = ((Instruction)code.getLast()).getA_i();
                        int y = arrSize(z);
                        if(((Variable)table.get(x)).getValue()<y){
                            genDo(InsType.lod,0,x);
                        }else{
                            sen.offer("数组访问越界");
                            flag = true;
                        }
                    }else{
                        sen.offer("变量" + word[0] + "未声明!");
                        flag = true;
                    }
                    nextToken(); 
                if(word[0].equals("]")){
                    sen.offer(word[0]);                    
                    nextToken();            
                }else{
                    sen.offer("第" + lineNum + "行:缺少]!");
                }
            }else{
                sen.offer("第" + lineNum + "行:请输入正确的数组下标! ");
            }            
        }else if(!(word[0].equals(";")||word[0].equals("else")||word[0].equals("}")||word[0].equals("#")||word[1].equals("LO")||word[0].equals(")")||word[0].equals("+")||word[0].equals("-")||word[0].equals("*")||word[0].equals("/")||word[0].equals("]"))){
            sen.offer("第" + lineNum + "行:请输入正确的因子式!");
        }
    }
    
    // K --> PzP  <条件> --> <表达式><关系运算符><表达式>
    public void condition(){
        if(word[0].equals("(")||word[1].equals("ID")||word[1].equals("INT")||word[1].equals("REAL")){
            sen.offer("条件:");
            sen.offer("$");
            expression();
            if(word[1].equals("LO")){
                sen.offer("关系运算符:");
                sen.offer("$");
                sen.offer(word[0]);
                sen.offer("%");
                //记录关系运算符
                String lo = word[0];
                nextToken();
                expression();
                //根据不同的关系运算符生成不同的目标代码
                if(lo.equals("==")){
                    genDo(InsType.opr,0,6);
                }else if(lo.equals("<")){
                    genDo(InsType.opr,0,7);
                }else if(lo.equals("<>")){
                    genDo(InsType.opr,0,8);
                }
                sen.offer("%");
            }else{
                sen.offer("第" + lineNum + "行:请输入正确的关系运算符!");
            }
        }else{

            sen.offer("第" + lineNum + "行:条件表达式出错!");
        }
    }
    
    /** 在名字表中加入一项
     * 
     * @param t 名字表尾指针
     * @param nme 名字
     * @param typ 名字种类
     * @param val 名字值
     * @param isA 是否为数组 
     */
    public void enter(String nme, VarType typ, double val, boolean isA){

        Variable v = new Variable(nme,typ,val,isA);
        table.offer(v);
    }
    
        public void enter(String nme, VarType typ, int val, boolean isA){

        Variable v = new Variable(nme,typ,val,isA);
        table.offer(v);
    }
    
    // 生成中间代码至列表末尾
    public void genDo(InsType i, int l, int a){
        Instruction ins = new Instruction(i,l,a);
        code.offer(ins);
    }
    
        public void genDo(InsType i, int l, double a){
        Instruction ins = new Instruction(i,l,a);
        code.offer(ins);
    }
        
    // 添加一项中间代码至列表指定位置
        public void genDo(int index, InsType i, int l, int a){
            Instruction ins = new Instruction(i,l,a);
            code.add(index, ins);
        }
        
        public void genDo(int index, InsType i, int l, double a){
            Instruction ins = new Instruction(i,l,a);
            code.add(index, ins);
        }
    
    // 将String类型转换成VarType枚举类型值
    public VarType toVarType(String type){
        if(type.equalsIgnoreCase("INT")){
            return VarType.INT;
        }else if(type.equalsIgnoreCase("REAL")){
            return VarType.REAL;
        }
        return VarType.INT;
    }
    
    // 获得当前实例中code的队列
    public LinkedList getCode(){
        return code;
    }
    
    //获得当前实例中table的队列
    public LinkedList getTable(){
        return table;
    }
    
    // 变量在名字表中的位置,同时,通过判断返回值是否为-1判断该变量是否声明
    public int isIden(String s){
        int i;
        for(i = 0; i<table.size();i++){
            if(((Variable)table.get(i)).getName().equals(s)){
                return i;
            }
        }
            return -1;
    }
    
    /**
     *  获取数组的大小
     * 
     * @param i 数组第一个元素在名字表中的地址
     * @return
     */
    public int arrSize(int i){
        int size=0;
       String name = ((Variable)table.get(i)).getName();
       for(int x = i; x<table.size();x++){
           if(((Variable)table.get(x)).getName().equals(name)){
               size++;
           }else{
               return size;
           }
       }
       return size;
    }
    
    
    // 判断是否通过语义分析
    public boolean isErr(){
        return flag;
    }
    
 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -