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

📄 analyse.java

📁 JAVA的CMM编译器(词法+语法+语义+输出结果)
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
        if(word[0].equals("=")){
            sen.offer("%");
            sen.offer("算术运算符:");
            sen.offer("$");
            sen.offer(word[0]);
            sen.offer("%");
            nextToken();
            expression();
            genDo(InsType.sto,0,adr);
        }else if(word[0].equals("[")){
            sen.offer(word[0]);
            nextToken();
            if(word[1].equals("INT")){
                sen.offer(word[0]);
                // 判断数组是否越界
                int num = Integer.parseInt(word[0]);
                if(Integer.parseInt(word[0]) < arrSize(adr)){
                    
                }else{
                    sen.offer("访问数组越界!");
                    flag = true;
                }
                nextToken();
                if(word[0].equals("]")){
                    sen.offer(word[0]);
                    nextToken();
                    if(word[0].equals("=")){
                        sen.offer("%");
                        sen.offer("算术运算符:");
                        sen.offer("$");
                        sen.offer(word[0]);
                        sen.offer("%");
                        nextToken();
                        expression();
                        genDo(InsType.sto,0,adr);
                        genDo(InsType.lit,0,num);
                    }else{
                        sen.offer("第" + lineNum + "行:请为数组赋值!");
                    }
                }else{
                    sen.offer("第" + lineNum + "行:缺少] !");
                }
                
            }else if(word[1].equals("ID")){
                sen.offer(word[0]);
                // 判断变量是否声明
                int y = isIden(word[0]);
                
                if(y>=0){
                    // 判断数组是否越界
                    int z = ((Variable)table.get(y)).getValue();
                    if(z < arrSize(adr)){
                        nextToken();
                if(word[0].equals("]")){
                    sen.offer(word[0]);
                    nextToken();
                    if(word[0].equals("=")){
                        sen.offer("%");
                        sen.offer("算术运算符:");
                        sen.offer("$");
                        sen.offer(word[0]);
                        sen.offer("%");
                        nextToken();
                        expression();
                        genDo(InsType.sto,0,adr);
                        genDo(InsType.lod,0,y);
                    }else{
                        sen.offer("第" + lineNum + "行:请为数组赋值!");
                    }
                }else{
                    sen.offer("第" + lineNum + "行:缺少] !");
                }
                    }else{
                        sen.offer("数组访问越界!");
                        flag = true;
                        nextToken();
                if(word[0].equals("]")){
                    sen.offer(word[0]);
                    nextToken();
                    if(word[0].equals("=")){
                        sen.offer("%");
                        sen.offer("算术运算符:");
                        sen.offer("$");
                        sen.offer(word[0]);
                        sen.offer("%");
                        nextToken();
                        expression();
                        genDo(InsType.sto,0,adr);
                        genDo(InsType.lod,0,z);
                    }else{
                        sen.offer("第" + lineNum + "行:请为数组赋值!");
                    }
                }else{
                    sen.offer("第" + lineNum + "行:缺少] !");
                }
                    }
                }else{
                    sen.offer("变量" + word[0] + "未声明!");
                    flag = true;
                    nextToken();
                    if(word[0].equals("]")){
                        sen.offer(word[0]);
                        nextToken();
                        if(word[0].equals("=")){
                             sen.offer("%");
                        sen.offer("算术运算符:");
                        sen.offer("$");
                        sen.offer(word[0]);
                        sen.offer("%");
                        nextToken();
                        expression();
                        }else{
                             sen.offer("第" + lineNum + "行:请为数组赋值!");
                        }
                    }else{
                        sen.offer("第" + lineNum + "行:缺少] !");
                    }
                }                
                
            }else{
                sen.offer("第" + lineNum+ "行:请输入整数作为数组下标!");
            }
        }else{
            sen.offer("第" + lineNum + "行:变量赋值,等号右边请输入正确的表达式!");
        }
    }
    
    // R --> read M  <读语句> --> read <输入串>
    public void readIn(){
        if(word[0].equalsIgnoreCase("read")){
                sen.offer(word[0]);
                //genDo(InsType.opr,0,12);
                nextToken();
                input();
               // sen.offer("%");
        }else{
            sen.offer("第" + lineNum + "行:读语句,请输入正确的关键字read!");
        }
    }
    
    // M --> i M1  
    public void input(){
       if(word[1].equals("ID")){
           sen.offer(word[0]);
           if(isIden(word[0])>=0){
               genDo(InsType.opr,0,12); 
               genDo(InsType.sto,0,isIden(word[0]));

           }else{
               sen.offer("变量"+word[0]+"未声明");
               flag = true;
           }
           nextToken();
            input_1();
        }else{
            sen.offer("第" + lineNum + "行:写语句,请输入正确的单个表达式作为输出串!");
        }
    }
    
    // M1 --> [i] | | [x] | null
   public void input_1(){
       if(word[0].equals("[")){
            sen.offer(word[0]);
            nextToken();
            if(word[1].equals("INT")||word[1].equals("ID")){
                sen.offer(word[0]);
                int y = ((Instruction)code.peekLast()).getA_i(); //数组在table表中的 第一个变量的地址
                if(word[1].equals("INT")){                    
                    //int x = y + Integer.parseInt(word[0]);
                    if(Integer.parseInt(word[0])<arrSize(y)){
                          //((Instruction)code.peekLast()).setA(x);
                          genDo(InsType.lit,0,Integer.parseInt(word[0]));
                    }else{
                        sen.offer("数组越界!");
                        flag = true;
                    }                  
                }else{
                    // 判断数组下标变量i是否声明
                    if(isIden(word[0])>=0){
                        //判断数组下标是否越界
                        if(((Variable)table.get(isIden(word[0]))).getValue()<arrSize(y)){
                            genDo(InsType.lod,0,isIden(word[0]));
                        }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("#"))){
            sen.offer("第" + lineNum + "行:请输入正确的数组变量!");
        }                 
    }
    
    // W--> write N   <写语句> -->write  <输出串>
    public void writeOut(){
        if(word[0].equalsIgnoreCase("write")){
                sen.offer(word[0]);
                nextToken();
                output();
                //输出栈顶到屏幕
                genDo(InsType.opr,0,10);
                //输出换行 
                genDo(InsType.opr,0,11);
        }else{
            sen.offer("第" + lineNum + "行:写语句,请输入正确的关键字write!");
        }
    }
    
    // N--> P   <输出串> --> <表达式>
    public void output(){
        if(word[0].equals("(")||word[1].equals("ID")||word[1].equals("INT")||word[1].equals("REAL")){
            expression();
        }else{
            sen.offer("第" + lineNum + "行:写语句,请输入正确的单个表达式作为输出串!");
        }
    }
    
    //C --> {S`}     <复合语句> -->{ <语句串>}
    public void composition(){
        if(word[0].equals("{")){
            sen.offer(word[0]);
            nextToken();
            an();
            if(word[0].equals("}")){
                sen.offer(word[0]);
                nextToken();
            }else{
                sen.offer("第" + lineNum + "行:缺少} !");
            }
        }else{
            sen.offer("第" + lineNum + "行:复合语句,请输入{开始复合语句!");
        }
    }
    
    // B --> if (K)SB1      
    public void if_statement(){
        if(word[0].equalsIgnoreCase("if")){
            sen.offer(word[0]);
            nextToken();
            if(word[0].equals("(")){
                sen.offer(word[0]);
                nextToken();
                condition();
                if(word[0].equals(")")){
                    sen.offer(word[0]);
                    //为假则跳到循环体后的第一条指令
                    int adr1 = code.size();
                    genDo(InsType.jpc,0,0);
                    nextToken();
                    statement();
                    // 跳到else执行完后的下一条语句    
                    int adr2 = code.size();
                    genDo(InsType.jmp,0,0);
                    
                    if_s1();
                    int adr3 = code.size();
                    //将跳转语句中的a值补上
                    ((Instruction)code.get(adr1)).setA(adr2+1);
                    ((Instruction)code.get(adr2)).setA(adr3);
                    sen.offer("%");
                }else{
                    sen.offer("第" + lineNum + "行:if语句,请以)结束条件!");
                }
            }else{
                sen.offer("第"+lineNum + "行:if语句,if后请输入正确的条件语句!");
            }
        }else{
            sen.offer("第" + lineNum + "行:if语句出错!");
        }
    }
    
    //B1 --> else S
    public void if_s1(){
        if(word[0].equalsIgnoreCase("else")){
                sen.offer(word[0]);
                nextToken();
                statement();
        }else if(!(word[0].equals(";")||word[0].equalsIgnoreCase("else")||word[0].equals("}")||word[0].equals("#"))){
            sen.offer("第" + lineNum + "行:if语句出错!");
        }
    }
    
    // H-->while (K) S           <while语句>--> while (<条件>) <语句>
    public void while_statement(){
        if(word[0].equalsIgnoreCase("while")){
                sen.offer(word[0]);
                nextToken();
                if(word[0].equals("(")){
                    sen.offer(word[0]);
                    // 下一条目标代码的地址
                    int adr1 = code.size();
                    nextToken();
                    condition();
                    if(word[0].equals(")")){
                        sen.offer(word[0]);
                        //为假跳到循环体后的第一条指令,地址暂时未知 
                        int adr2 = code.size();
                        genDo(InsType.jpc,0,0);                        
                        nextToken();
                        statement();
                        // 回到while循环的第一条指令
                        genDo(InsType.jmp,0,adr1);
                        int adr3 = code.size();
                        ((Instruction)code.get(adr2)).setA(adr3);                        
                        sen.offer("%");
                    }else{
                        sen.offer("第" + lineNum + "行:while语句,缺少)结束条件!");
                    }
                }else{

⌨️ 快捷键说明

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