littlec递归下降的语法分析及词法分析解读_第1页
littlec递归下降的语法分析及词法分析解读_第2页
littlec递归下降的语法分析及词法分析解读_第3页
littlec递归下降的语法分析及词法分析解读_第4页
littlec递归下降的语法分析及词法分析解读_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Little c递归下降的语法分析实验报告一.语法分析对应little c 文法小c程序 := 主函数#|外部定义 主函数#注:其中#'为语法分析时分析结束的标志,无实际意义主函数:=main() 函数体外部定义 := 变量声明 外部函数定义变量声明:=null|类型区分符 标识符; 类型区分符标识符)注:大括号内为一个循环体,表示可出现多次,下同。外部函数定义 := 类型区分符 函数说明符 函数体类型区分符:=int|char函数说明符 := 函数名()函数名 :=标识符函数体:=变量声明 嘴句表语句表 :=语句; 语句语句 :=赋值tg句|条件语句 |循环语句|函数调用语句 |;赋

2、值语句 := 左部 =有部左部 := 变量名右部:= 算术表达式算术表达式 :=项+项 |- 项 项:=因子*因子 | / 因子因子:=ID | NUM |(算术表达式)条件语句:=if(关系表达式 ) 语句|if (关系表达式)语句else语句关系表达式 一算术表达式关系运算符算术表达式变量名 :=标识符关系运算符 :=| ! =|=|=|=加运算符:=+|-乘运算符:=*|/循环语句:=while (关系表达式 ) 语句二.实验简介本实验采用递归子程序法完成了上述语言文法的语法分析,正确的程序经过分析显示“分析完毕,正确”,错误的程序经过分析,对其进 行报错,虽不能准确定位错误,但是大致可

3、以确定错误类型。因上次词法分析被误删,所以本程序结合词法分析与语法分析于一体,同时对源程序进行词法与语法分析。但由于个人能力有限,故没有生成语 法树,也没有错误恢复处理。本程序只是完成了对含有外部数据定义, 外部函数,main函数的c程序的语法分析,并且对if语句,while语句,函数调用语句,空语句(; ) ,表达式进行了相应的分析。三函数功能及全局变量简介Syn:经词法分析后,每个单词对应的标识Kk: 出错的标识,有错置一mainfunc(); main 函数处理程序。funcbody(); 函数体处理程序。outdef(); 外部定义处理函数vardef(); 变量声明处理函数outfu

4、nc(); 外部函数处理函数yjc(); 语句串处理函数statement(); 语句处理函数assignstmt(); 赋值语句处理函数funcall(); 函数调用处理语句conditstmt(); 条件语句处理函数loopstmt(); 循环语句处理函数relexp() ;关系表达式处理函数expression(); 算术表达式处理函数factor(); 因子处理函数term(); 项处理函数parser(); 语法分析scaner(); 读取下一个单词四.符号表单词符号种别码单词符号种别码main117If2=18else3<20wile4!=21int5<=22char6

5、>23标识符10>=24数字一11=25+1326一14(27*15)28/16#02930五.结果测试:正确结果测试:1 .只含main函数:main()int y;int x;x=3;y=1;if(x>y)x=x-y;else x=y-x;while(x>y)x=x-y;# . F:Debu gbyzy.exe,合路径)i testl.txty=l;if Cx>y>WWA> na in <><x=x-y;else x=yx; while<x>y>完?,产八瑞2 .含外部函数int cal()int a;int b

6、;int c;a=0;b=3;c=a+b;main()int y;int x;x=3;y=1;if(x>y)x=x-y;else x=y-x; while(x>y) x=x-y;cal();#'F:Debu gbyzy,exe-回3 .含外部数据说明以及外部函数int m;int n;int cal()int a;int b;int c;a=0;b=3;c=a+b; main()int y;int x;x=3;y=i;if(x>y)x=x-y;else x=y-x; while(x>y) x=x-y;cal();# F:Debu gVbyzy.exe"

7、W输入文件名(合路径):七小ti.wt Int m; int n; int cal<>< int a; int b; int c 1 <*=B» b=3; c=a+b;main< >< int >; int x;t/=i;X=x-y;else x; whil&<x>> x=x-; calO; 9E析完成功,错误结果测试:1 .main 后缺 main()int y;int x;x=3;y=1;if(x>y)x=x-y;else x=y-x;while (x>y)x=x-y;#2 .声明变量缺少“ i

8、ntmain()y;int x;x=3;y=1;if(x>y)x=x-y;else x=y-x;while (x>y)x=x-y;#3,赋值符号'='误写成'='main()int y;int x;x=3;y=i;if(x>y)x=x-y;else x=y-x;while (x>y)x=x-y;#4.关键字写错源代码:#include "stdio.h #include "string.h"#include "stdlib.h"#include "windows.h"c

9、har prog2000,token8,ch;char *rwtab6="main","if","else","while","int","char"int syn,p,m,n,sum;int kk;mainfunc();funcbody();outdef();vardef();outfunc();yjc();assignstmt();funcall();conditstmt();loopstmt();factor();relexp();expression();term()

10、;statement();parser();scaner();main()FILE *fp1;char filename10;p=kk=0;printf(" 请输入文件名(含路径) : ");gets(filename);if(fp1=fopen(filename,"r")=NULL)printf(" 无法打开此文件 ");exit(0);else while(!feof(fp1)progp+=fgetc(fp1);puts(prog);fclose(fpl);p=0;scaner();parser();getchar();)z*=语

11、 法 分 析=*/parser()(if(syn=1)mainfunc();)elseif(syn=5|syn=6)outdef();mainfunc();)elseprintf("无效的 little C 程序 n");kk=1;)if(syn=0)&&(kk=0)printf("成功!n");return;)/*= 主 函 数 处 理 函 数=*/mainfunc()if(syn=1)scaner();elseprintf("没有 main 函数 n");kk=1;scaner();if(syn=27)scaner

12、();elseprintf("main 后需要一个 ( n");kk=1;scaner();if(syn=28)scaner();elseprintf("main 函数中 (后需要一个) n");kk=1;scaner();funcbody();return;/*= 函 数 体 处=*/funcbody()if(syn=29)scaner();elseprintf("函数需要一个 n");kk=1;scaner();vardef();yjc();if(syn=30)scaner();if(syn=0)printf("分析完

13、n");return;elseprintf("函数后未匹配的 n");kk=1;) return;)/*= 外部定义处理函数=*/outdef()vardef();outfunc();return;/*= 变量声明处理函数=*/vardef()if(syn=5|syn=6)scaner();if(syn=10)scaner();while(syn=26) scaner();if(syn=5|syn=6)scaner();if(syn=10)scaner();else break;else printf("datatype 后需要一个标识符 n"

14、);kk=1;else if(syn=2|syn=4|syn=10|syn=26)return;else printf("未声明的变量n");kk=1;)return;)/*= 外部函数处理函数=*/outfunc()if(syn=27)scaner();elseprintf("外部函数名后需要一个(n");kk=1;scaner();if(syn=28)scaner();elseprintf("外部函数中未匹配的(n");kk=1;scaner();)funcbody();return;)/*=语句串处理程序=*/yjc()(sta

15、tement(); /* 调用函数 statement。;*/while(syn=26)(scaner();/*读下一个单词符号*/if(syn!=30)statement();/* 调用 函数 statement();*/)return;)/*=语句处理程序=*/statement()(if(syn=10)(scaner();if(syn=25)assignstmt();else if(syn=27)funcall();elseprintf(" 期待一个 = 或 ( n");kk=1;else if(syn=2)conditstmt();else if(syn=4)loo

16、pstmt();else if(syn=26)return;else printf(" 非法的语句 !n");return;)z*=赋值语句处理函数=*/assignstmt()scaner();/*读下一个单词符号*/expression(); /* 调用函数 statement。;*/ return;)/*= 函数调用语句处理函数 =*/funcall()scaner();if(syn=28)scaner();else printf("函数调用语句需要一个(n");kk=1;scaner();)return;)/*=条件语句处理函数=*/condit

17、stmt()scaner();if(syn=27)scaner();relexp();if(syn=28)scaner();else printf("if语句中未匹配的(''n");kk=1;scaner();)statement();if(syn=26)scaner();if(syn=3)scaner();statement();elseif(syn=10)|(syn=2)|(syn=4)|(syn=26)return;elseprintf("if 后非法的的语句 n");kk=1;elseprintf("if 语句中需要一个

18、; n");kk=1;elseprintf("if 语句中需要一个(n");kk=1;)return;)/*=循环语句处理函数=*/loopstmt()scaner();if(syn=27)scaner();relexp();if(syn=28)scaner();elseprintf("while 语句中需要一个)'n");kk=1;scaner();)statement();)elseprintf("while 语句中需要一个('n");kk=1;)return;)/*= 关系表达式处理函数=*/relex

19、p()expression();if(syn=18)|(syn=20)|(syn=22)|(syn=21)|(syn=23)|(syn=24)scaner();elseprintf("关系表达式中需要一个关系运算符n");kk=1;scaner();)expression();return;)/*算术表达式处理程序*/expression() term();while(syn=13)|(syn=14) scaner();/*读下一个单词符号*/term();/* 调用函数 term();*/return;/*=项处理程序=*/term() factor();while(sy

20、n=15)|(syn=16) scaner();/*读下一个单词符号*/factor();/* 调用函数 factor(); */return;/*=因子处理程序=*/factor() if(syn=10)|(syn=11) scaner();else if(syn=27) scaner();/*读下一个单词符号*/expression();/* 调用函数 statement。;*/if(syn=28) scaner();/*读下一个单词符号*/else printf("the error on '('n"); kk=1;else printf("

21、the expression error!n");kk=1; return;/*= 读下一个字符进行词法分析 =*/scaner() sum=0;for(m=0;m<8;m+) tokenm=NULL; m=0;ch=progp+;while(ch=' ')|(ch='n') ch=progp+;if(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A')while(ch<='z'

22、)&&(ch>='a')|(ch<='Z')&&(ch>='A')|(ch>=(ch<='9')tokenm+=ch;ch=progp+;)P-;syn=10;tokenm+='0'for(n=0;n<6;n+)if(strcmp(token, rwtabn)=O)syn=n+1;break;)else if(ch>='0')&&(ch<='9')while(ch>='0')&&(ch<='9')sum=sum*10+ch-'O'ch=progp+;P-;syn=11;)else switch(ch)(case '<':m=0;ch=progp+;if(ch='=')syn=22;)else syn=20;P-;)break;case '>':m=0;ch=prog

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论