当前位置: 网学 > 交易代码 > SQL语法 > 正文

语法分析

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: myeducs.cn 发布时间: 13/03/16

【网学网提醒】:网学会员为需要朋友们搜集整理了语法分析相关资料,希望对各位网友有所帮助!


    #include"function.h"
    boolP();//程序
    boolS();//语句
    boolSIF();//条件语句
    boolSDE();//定义语句
    boolSA();//赋值语句
    boolSW();//循环语句
    boolSC();//复合语句
    boolB();//布尔表达式
    boolb();//布尔表达式的子项
    boolE();//数值表达式
    boolT();//数值表达式的因式
    boolF();//因式的项
    voidadvance();//缓冲下一个单位
     char*infile;//codetext
     char*reserve;//key-word
    
     char*id_list="";//id-list
     char*constant="";//constantlist
    
     intu=1;//rowN.O
     intv=0;//i-visthecolumN.O
    
     inti=0;//reccordcurrentcodechar
     tuplech;
     voidadvance(){
     ch=action(infile,id_list,constant,reserve,i,u,v);
     };
    boolP(){//对于本程序的异常(错误)的定义——当前字不是“期望”的时候认为是错误
     //异常有以下几种情况:1.“缺少”期望的字2.“多余”的字符3.“缺少”和“多余”并存
     //对于“多余”,因为这种情况意味着下文有“期望”的字出现,这种情况是很复杂的,所以不讨论,
     //因此本程序遇到异常时,默认是属于“缺少”。
     FILE*cons=fopen(".\\constant.txt","w");
     FILE*id=fopen(".\\id.txt","w");
     readFile(".\\code.txt",infile);
     readFile(".\\reserve.txt",reserve);
     advance();
     boolflag;
     if(ch.type==1){advance();flag=true;}//program
     else{printf("nokeyword\"program\"\n");flag=false;}
    
     if(ch.type==33){advance();flag=flag&;true;}//processname
     else{printf("nopragramname\n");flag=false;}
     if(ch.type==26){advance();flag=flag&;true;}//程序名后的';'
     else{printf("lackchar';'\n");flag=false;}
     //进入语句集合,可为0到多个句子组成
     while((ch.type!=24)&;&;(ch.type!=0)){flag=flag&;S();}
     print(cons,constant,1);
     fclose(cons);
     print(id,id_list,1);
     fclose(id);
    
     returnflag;
    }
    ///////////////////////////////////
    boolS(){//语句
     boolflag=true;
     if(ch.type==9){printf("SIF\n");advance();flag=flag&;SIF();}//进入条件语句
     elseif(ch.type==4){printf("SDE\n");advance();flag=flag&;SDE();}//进入定义语句
     elseif(ch.type==33){printf("SA\n");advance();flag=flag&;SA();}//进入赋值语句
     elseif(ch.type==12){printf("SW\n");advance();flag=flag&;SW();}//进入循环语句
     elseif(ch.type==2){printf("SCbegin\n");advance();flag=flag&;SC();}//进入复合语句
     elseif(ch.type==3){returntrue;}//遇到的有可能是end,如果是end不应该缓冲下一个字符,而应该让上一层的函数处理
     else{returnfalse;}
     returnflag;
    }
    boolSIF(){//条件语句
     boolflag=B();
     if(ch.type==10){advance();flag=flag&;S();}//then
     else{printf("lackkeyword\"then\"here\n");flag=false;}
     if(ch.type==11){advance();flag=flag&;S();}//else
     returnflag;
    }
    boolSDE(){//定义
    语句
     boolflag;
     if(ch.type==5){advance();flag=true;}//数据类型声明
     else{printf("lackvartype\n");flag=false;}
     if(ch.type==33){advance();}//变量名
     else{printf("lackvarname\n");flag=false;}
     do{
     if(ch.type==23){//逗号
     advance();
     if(ch.type==33)advance();
     else{printf("lackvarname\n");flag=false;break;}
     }
     elseif(ch.type!=26){printf("error\n");flag=false;break;}//不是分号时应该报错
     }while(ch.type!=26);//分号结束
     advance();
     returnflag;
    }
    boolSA(){//赋值
     boolflag=true;
     if(ch.type==25)advance();//赋值号
     else{printf("nochar':='\n");flag=false;}
     flag=flag&;E();//表达式
     if(ch.type==26)advance();//分号结束
     else{printf("nochar';'\n");flag=false;}
     returnflag;
    }
    boolSW(){//循环语句
     boolflag=B();
     if(ch.type==13){advance();flag=flag&;S();}//do
     else{printf("%d,%dnokeyword\"do\"here\n",u,i-v);flag=false;}
     returnflag;
    }
    boolSC(){//复合语句,由bigin和end围起来,中间可以有0到多个句子,
     boolflag=true;
     while(ch.type!=3){flag=flag&;S();}//不是end,认为复合语句未结束
     advance();
     returnflag;
    }
    ///////////////////////////
    boolB(){//布尔表达式
     boolflag=b();
     while((ch.type==6)||(ch.type==7)){advance();flag=flag&;b();}//and,or
     returnflag;
    }
    boolb(){//布尔表达式的子项
     boolflag=E();
     if((ch.type>26)&;&;(ch.type<33))advance();//比较符号
     else{printf("nobooloperatorhere\n");flag=false;}
     flag=flag&;E();
     returnflag;
    }
    ///////////////////////////////////
    boolE(){//数值表达式
     boolflag=T();
     while((ch.type==17)||(ch.type==18)){advance();flag=flag&;T();}//加减号
     returnflag;
    }
    boolT(){
     boolflag=F();
     while((ch.type==19)||(ch.type==20)){advance();flag=flag&;F();}//乘除号
     returnflag;
    }
    boolF(){
     if((ch.type==33)||(ch.type==34)){advance();returntrue;}//数字或者变量
     elseif(ch.type==21){//左括号
     advance();
     boolflag=E();
     if(ch.type==22){advance();returntrue;}//右括号
     else{printf("no')'\n");returnfalse;}
     }
     else{
     printf("illegalchar'%d'\n",ch.type);
     advance();
     returnfalse;
     }
    }
    
  • 上一篇资讯: 资料
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号