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

📄 syntax.java

📁 编译原理词法语法分析器课程设计,包含文档与代码.
💻 JAVA
字号:
//------------------------------------------------
//类描述: 语法分析类,分析语法,记录符号表,处理语法错误
//文件名: Sytax.java
//------------------------------------------------

package cp;

class Syntax {
  int id = 0;
  String sym= null;
  int oldid = 0;
  String oldsym = null;
  int oldSP = 0;
  String tabFunc[][] = new String[50][2];//函数登记//函数名-返回类型
  String funcParam[][] = new String[50][10];//行参登记//类型-标识.....类型-标识//行存储格式
  String tabVar[][] = new String[50][4];//变理登记//标识-类型-值-范围(范围与函数符号表的下标有关)
  String preStr[] = new String[2];
  int tabFPoint = 1;
  int tabVPoint = 0;
  String  exp = "";
  boolean isFuncEnd = true; //函数分析标志--是否还处在分析未完成状态
  boolean isOneTime = false;//次数标志
  StringBuffer errInfo = new StringBuffer();
  int oldLine = 0;
  Lex lex = null;
  Syntax(String filepath) {
    lex = new Lex(filepath);
    start();
  }

  //取下一个单词
  int nextSYM(){
    oldsym = sym;
    oldid = id;
    oldSP = lex.sbPoint;
    id=lex.getSYM();
    sym = lex.sym;
    return id;
  }

  //开始分析
  int start(){
    if(nextSYM()==-1) return -1;
    switch (id) {
      case 0://非法字符
        err(1);
        jumpErrorLine();
        break;
      case 1://定义性语句
         if(pre()==-1) return -1;
         if(nextSYM()==-1) return -1;
         if(sym.equals("(")){//函数定义
           tabFunc[tabFPoint][0] = preStr[1];
           tabFunc[tabFPoint][1] = preStr[0];
           func();
         }
         if(sym.equals("=")) definition();//变量定义
         break;
       case 4:
         if(nextSYM()!=1)
           if(sym.equals("=")) var();
           else{
             err(15);
             jumpErrorLine();
           }
         break;
       default:
         err(15);
         break;
     }
    start();
    return 1;
  }

  //定义性语句头部处理
  int pre(){
    if(sym.matches(Compiler.DE_WORDS)) preStr[0] = sym;
    else err(2);//非法保留字
    if(nextSYM()==-1) return -1;
    if(sym.matches(Compiler.ID)) preStr[1] = sym;
    else err(5);//标识符错误
    return 1;
  }

  //函数处理
  int func() {
    isFuncEnd = false;
    if( recordParameter() == -1 ) return -1;
    if(nextSYM()==-1) return -1;
    if(sym.equals("{")) comStatement();
    if(!sym.equals("}")) err(11);
    else tabFPoint++;
    isFuncEnd = true;
    return 1;
  }

  //形参登记
  int recordParameter(){
    int i = 0;
    while( nextSYM()!=-1 ){
      if( (i % 2)==0 ){
        if(sym.equals(")") ) break;
        if(sym.matches(Compiler.DE_WORDS) ) funcParam[tabFPoint][0] = sym;
        else err(2); //非法保留字
        i++;
      }
      else if(sym.matches(Compiler.ID)){
        funcParam[tabFPoint][1] = sym;
        i++;
      }
      else{
        err(5); //形参标识符错
        i++;
      }
    }
    if(id == -1) return -1;
    else return 1;
  }

  int callFunc(){
    //调用形式是否正确,待扩充----------------------------------------------------
    return 1;
  }

  //赋值处理
  int var(){
    if(expression()!=-1)
      if(sym.equals(";")) ;
      else{
        err(7);
        return -1;
      }
    return 1;
  }

  //复合语句处理
  int comStatement(){
    while(nextSYM()!=-1&&!sym.equals("}")){
        switch (id) {
          case 0://非法字符
            err(1);
            jumpErrorLine();
            break;
          case 1://定义性语句
            if(pre()==-1) return -1;
            if(nextSYM()==-1) return -1;
            if(sym.equals("(")){//函数定义
              ;//函数嵌套出错处理, 待扩充
            }
            if(sym.equals("=")) definition();//变量定义
            break;
          case 3://控制语句
            control();
            break;
          case 4://函数调用语句或赋值
            if(nextSYM()==-1) return -1;
            if(sym.equals("(")) callFunc();
            else if(sym.equals("=")) var();
            break;
        }
        if(isOneTime) {
          isOneTime = false;
          break;
        }
      }

    return 1;
  }

  //控制语句处理
  int control(){
     if(sym.equals("if")){
       if (endErr())return -1;
       if (sym.equals("(")) {
         condition();
         if (endErr()) return -1;
         if (sym.equals("{")) {
           comStatement(); //若是大括号 复合语句分析
           if (!sym.equals("}")) err(11);
         }

         else { //否则语句分析
           isOneTime = true;
           Lex.sbPoint = oldSP;
           comStatement();
         }
       }
       if (nextSYM() == -1) return -1;
       if (sym.equals("else")) { //若是”else"
         if (nextSYM() == -1) return -1;
         if (sym.equals("{")) {
           comStatement(); //若是大括号 复合语句分析
           if (!sym.equals("}")) err(11);
         }
         else { //否则语句分析
           isOneTime = true;
           Lex.sbPoint = oldSP;
           comStatement();
         }
       }
       else return 1;
     }
     else if(sym.equals("while")){
       if(endErr()) return -1;
       condition();
       if(endErr()) return -1;
       if(sym.equals("{")){
         comStatement(); //若是大括号 复合语句分析
         if(!sym.equals("}")) err(11);
       }
       else{//否则语句分析
         isOneTime = true;
         Lex.sbPoint = oldSP;
         comStatement();
        }
     }
     else if(sym.equals("else")){
       err(16);
       if (nextSYM() == -1) return -1;
       if (sym.equals("{")) {
         comStatement(); //若是大括号 复合语句分析
         if (!sym.equals("}")) err(11);
       }
       else { //否则语句分析
         isOneTime = true;
         Lex.sbPoint = oldSP;
         comStatement();
       }
       return 1;
     }
     else if(!isFuncEnd){
       if (sym.equals("return")) expression();
         if (!sym.equals(";"))  err(7);
     }
     else{
       err(15); //语句位置不当,非法语句
       jumpErrorLine();
     }
     return 1;
   }

 //是否读完
  boolean endErr(){
    if(nextSYM()==-1){
      err(7); //某某语句错+缺少分号
      return true;
    }
    else  return false;
  }

  //定义性语句处理
 int definition(){
   tabVar[tabVPoint][0] = preStr[1];
   tabVar[tabVPoint][1] = preStr[0];
   expression();
   tabVar[tabVPoint][2] = exp;
   if(!isFuncEnd)  tabVar[tabVPoint][3] = ""+tabFPoint;//局部变量
   else  tabVar[tabVPoint][3] = "0";//全局变量
   tabVPoint++;
   if (!sym.equals(";"))  err(7);//缺失;号
   return 1;
  }

  //表达式处理
  int expression(){
    StringBuffer stack = new StringBuffer();
    int sp = 1;
    int i = 0;
    exp = "";
    while( nextSYM()!=-1 && !( sp==1&&sym.equals(")") || sym.equals(";") ) ){
      if(i%2==0){
        if (sym.equals(")")){
          sp--;
        }
        else if (sym.equals("(")){
          stack.append(sym);
          sp++;
        }
        else if ( id==4 || id==5 || id==6 || id==2 ){
          exp += sym;
          i++;
        }
        else  err(4);//无效运算量错
      }
      else if( sym.matches("[+|*|/]") || sym.equals("-") ){
        exp += sym;
        i++;
      }
    }
    if(exp.equals(""))  err(13);//表达式不能为空
    if(exp.length()>0){
      String expTemp = exp.substring(exp.length() - 1, exp.length());
      if ( expTemp.matches("[+|*|/]") || expTemp.equals("-") )
        err(14); //错误的表达式
    }
    if(sp<1) err(9);//缺失(括号
    if(sp>1) err(10);//缺失)括号
    return 1;
  }

  //因子处理
  int factor(String fac){
    //待扩充
    return 1;
  }

  //条件处理
  int condition(){
    expression();
    if(!sym.equals(")"))  err(9);//)号不匹配
    return 1;
    }


  //出错处理函数,记录行号,出错处相关行的字符
  void err(int er) {
    errInfo.append("test.txt"+":"+lex.line+":"+"    "+Compiler.errText[er]+"\n");
  }

  //读取出错行
  void jumpErrorLine(){
    oldLine = lex.line;
        while(nextSYM()!=-1 && !sym.equals(";"))
          if(oldLine!=lex.line){
            lex.sbPoint = oldSP;
            break;
          }
  }


 //-------------------------------测试-----------------------------------------------
 public static void main(String args[]) {
   //Syntax syntax = new Syntax("E:\\Java\\work\\N46020117\\cpLab\\classes\\test.txt");//调试后删除
   Syntax syntax = new Syntax(args[0]);
   System.out.println(syntax.errInfo.toString());
   if(syntax.errInfo.length()==0){
     System.out.println("----------------------Symbol Table---------------------");
     System.out.println();
     syntax.printFunc();
     System.out.println("-------------------------------------------------------");
     syntax.printVar();
     System.out.println("-------------------------------------------------------");
   }
 }

 //函数符号表调试
 void printFunc(){
   System.out.println("FuncID\t"+"Type\t"+"Param");
   for(int i=1; i<tabFPoint&&tabFunc[i][0]!=null; i++){
     for(int j=0; j<2; j++){
       System.out.print(tabFunc[i][j]+"\t");

     }
     for(int k =0; funcParam[i][k]!=null&&k<10; k++)
         System.out.print(funcParam[i][k]+"\t");
     System.out.println();
   }
 }
 //变量表调试
 void printVar(){
   System.out.println("VarID\t"+"Type\t"+"Value\t"+"Scope");
   for(int i=0; i<tabVPoint&&tabVar[i][0]!=null; i++){
     for(int j=0; j<4; j++)
       System.out.print(tabVar[i][j]+"\t");
     System.out.println();
   }

 }

 //-------------------------------------------------------------------------------------

}

⌨️ 快捷键说明

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