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

📄 语法分析.txt

📁 c++语言编写
💻 TXT
字号:
在这里我是写了一个小程序实现的自动生成分析表和规约函数。

LPCSTR LableName[]={ "ID","IF","ELSE","SWITCH","GOTO","RETURN","NUMBER","STRING","MAIN",
"ADD_OP","MUL_OP","ASSIGN_OP","CMP_OP","LOGIC_OP1","LOGIC_OP2",
"LPAREN","RPAREN","LBRACE","RBRACE","COLON","COMMA","SEMI",

"PROG","CPD_SMT","SMT_SEQ","LABLE","LB_SMT","SMT","CASE","CASES",
"NUMBERS","STRINGS","PAM_LIST","PRI_EXPR","POST_EXPR","MUL_EXPR","ADD_EXPR","CMP_EXPR","LOGIC_EXPR","EXPR","$END"
};

#define CNT (sizeof(LableName)/sizeof(LableName[0]))
char* getToken(char* &p){
 while(*p){
  if((*p==' ')||(*p=='\t')){
   ++p;
  }else{
   char *r=p;
   while(*p){
    if(('\n'==*p)||('\t'==*p)|| (' '==*p)){
     *p=0;
     ++p;
     break;
    }else{
     ++p;
    }
   }
   return r;

  }

 };
 return NULL;
 
}
bool sm(LPCSTR s,LPCSTR d){
 if(s&&d){
  return 0==strcmp(s,d);
 }
 return false;
}

#define m(x) (sm(getToken(p),x))
void yy2ini(){
 FILE* fp=fopen("lalr分析表.txt","r");
 FILE* fpo=fopen("lalr.ini","w");
 FILE* fp1=fopen("Rfun.c","w");
 char tmp[4096];
 while(fgets(tmp,4096,fp)){
  char* p=tmp;
  char* r=getToken(p);
  int i;
  if(sm(r,"state")){
   r=getToken(p);
   if(r)
   {
    i=atoi(r);
    fprintf(fpo,"[S%d]\n",i);
   }
  }else if(sm(r,"rule")){
   char* r1=getToken(p);
   if(r1){
    int n=atoi(r1);
    char* tmp[1024];
    int i=0;
    r=getToken(p);
    if(r)if(m("->")){
     while(tmp[i]=getToken(p))++i;
     fprintf(fp1,"//Rule[%d] %s -> ",n,r);
     for(int j=0;j<i;++j)
      fprintf(fp1,"%s ",tmp[j]);
     fprintf(fp1,
      "\nvoid Reduce%d(){\n",n);
     for(int j=0;j<i;++j)
      fprintf(fp1,
      " assert(TokenStack[%d]->tokenType==%s);\n",-j-1,tmp[i-j-1]);
     if(i>1)
      fprintf(fp1,
      " TokenStack.pop(%d);\n",i-1);
     fprintf(fp1,
      " TokenStack[-1]->tokenType=%s;\n"
      " StateStack.pop(%d);\n"
      "}\n\n",r,i);

    }
    

   }
            
  }else{
   char* r1=getToken(p);
   if(sm(r1,"shift,"))
   {
    if(m("and")&&m("go")&&m("to")&&m("state")){
     r1=getToken(p);
     if(r1){
      i=atoi(r1);
      fprintf(fpo,"%s=S%d\n",r,i);
     }
    }
   }else if(sm(r1,"go")){
    if(m("to")&&m("state")){
     r1=getToken(p);
     if(r1){
      i=atoi(r1);
      fprintf(fpo,"%s=G%d\n",r,i);
     }
    }
   }else if(sm(r1,"reduce"))//reduce using rule
   {
    if(m("using")&&m("rule")){
     r1=getToken(p);
     if(r1){
      i=atoi(r1);
      fprintf(fpo,"%s=R%d\n",r,i);
     }

    }
   }

  }
 }
 fclose(fp);
 fclose(fpo);

 fprintf(fp1,"typedef void REDUCE();\n"
  "REDUCE* Reduce[]={\n");
 for(int i=1;i<44;++i)
  fprintf(fp1,"\t&Reduce%d,\n",i);

 fprintf(fp1,"};\n");
 fclose(fp1);
}



主程序(lalr分析)

void main(){
 SCCompiler sc;
 sc.init();
 sc.open("test.sc");
 StateStack.push(0);
 TokenStack.push(new Token(START,0));
 while(1)
  try{
   Token*p=sc.getToken();

//   printf("Get %s @%d\n",LableName[p->tokenType],p->line);
rescan:
   if((StateStack[ST_TOP]==80)&&p->tokenType==ENDOFSTREAM)
    break;
   uint32_t r=LalrTab[StateStack[ST_TOP]][p->tokenType&0xffff];
   switch(r&0xf0000){
   case SMASK:
    TokenStack.push(p);
    StateStack.push(r&0xffff);
    break;
   case RMASK:{
    uint32_t id=r;
    do{
     id&=0xffff;
     Reduce[id-1]();
     id=LalrTab[StateStack[ST_TOP]][TokenStack[ST_TOP]->tokenType&0xffff];
    }while(ISR(id));
    if(ISG(id)){
     StateStack.push(id&0xffff);
     //StateStack[0]=(id&0xffff);
     goto rescan;
    }else
     assert(false);
        }
   default:
    assert(false);
   }
  }catch(int err){  printf("EOF %d",err);break; }

  printf("Accept\n");
  printf("StateStack  %d\n",StateStack[ST_TOP]);

⌨️ 快捷键说明

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