1 / 14
文档名称:

编译原理实验报告-语法分析.doc

格式:doc   大小:235KB   页数:14页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

编译原理实验报告-语法分析.doc

上传人:wc69885 2019/6/14 文件大小:235 KB

下载得到文件列表

编译原理实验报告-语法分析.doc

文档介绍

文档介绍:实验目的编制一个递归下降分析程序。加深对语法分析程序原理的理解。二、:<语句>::=begin<语句>{;<语句>}end<语句>::=<赋值语句><赋值语句>::=IDENT:=<表达式><表达式>::=[+|-]<项>{(+|-)<项>}<项>::=<因子>{(*|/)<因子>}<因子>::=IDENT|NUMBER|(<表达式>),以“.”结束,如果是文法正确的句子,则输出成功信息,打印“ess”,否则输出“error”,最好能指出错误原因。例如: 输入begina:=2*!输入beginx=!赋值语句左部标识符后面应是赋值号“:=”。为每个非终符编号一个子过程,各个非终结符过程调用关系如下:语句表达式项因子实验设计思路1)主程序示意图图1主程序示意图2)递归下降分析程序示意图图2递归下降分析程序示意图3)语句串分析过程示意图图3语句串分析过程示意图4)statement语句分析程序流程 图4statement语句分析函数示意图    图5expression表达式分析函数示意图         图6term分析函数示意图图7factor分析过程示意图四、#include""#include<>#include<>/*变量说明:line 从终端读入的字符串; 当前所指位置在计数器ptoken 为存放的单词自身字符串;当前所指位置在计数器mnumber 整型常数sym 每个单词符号种类*/enumsymbol{ period=0, ident, number, plus, minus, times, slash, eql, neq, lss, leq, gtr, geq, lparen, rparen, semicolon, es, beginsym, endsym, ifsym, thensym, whilesym, dosym, nil,};charline[80],token[8],ch;enumsymbolsym;intp,m,num; char*rwtab[6]={"begin","end","if","then","while","do"};intErr;voidgetsym();intblock();voidstatement();voidexpression();voidterm();voidfactor();voidmain(){ //读了字符串, p=0; printf("\npleaseinputastring(endwith'.'):"); do { scanf("%c",&ch); line[p++]=ch;}while(ch!='.'); line[p++]='\0'; //逐个单词扫描; Err=0; p=0; getsym(); //当前扫描的单词存放在sym中 block(); if((sym==0)&&(Err==0)) printf("ess!\n");}voidprintSym(inti){ switch(i) { case0: //结束符. return; case2:printf("(%-5d%10d)\n",sym,num); //NUMBER break; case23: //printf("youhaveinputawrongstring\n"); break; default:printf("(%-5d%10s)\n",sym,token); break; }}voidgetsym(){ for(m=0;m<8;m++)token[m++]=NULL; ch=line[p++]; m=0; while((ch=='')||(ch=='\n')) //略去空格,无效字符 { ch=line[p++]; } //字母打头的字符串:标识符 if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')) { while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch>='0'&&ch<='9')) { token[m++]=ch; ch=line[p++]; } p--; sym=ident; token[m++]='\0';//比较是否为保留字 for(inti=0;i<6;i++) { if(strcmp(rwtab[i],token)==0) { switch(i) { case0:sym=beginsym; break; case1: sym=endsym;