欢迎来到天天文库
浏览记录
ID:36521280
大小:141.88 KB
页数:9页
时间:2019-05-11
《语法分析器的设计》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、编译原理实验指导书《编译原理》综合性实验二:语法分析器的设计实验目的:掌握高级语言语法结构的定义,掌握语法分析的常用方法――递归下降的分析方法。实验要求:在6学时内完成全部内容,要求用VC++窗口界面实现。实验内容:分为3次实验内容完成。2.1语法分析程序的设计要求语法分析程序要求能实现Sample语言中几种最常见的、基本的语法单位的分析:算术表达式、逻辑表达式、赋值语句、IF语句、for语句、while语句、repeat语句等,各个语法单位的定义见第1章,要求有完整的程序和说明。2.2语法分析程序的设
2、计方法语法分析程序可以根据个人的掌握情况选用常见的几种语法分析方法:递归下降分析方法、LL(1)预测分析法、算符优先分析、LR分析等方法中的任何一种来实现,也可以选用不同的方法来分析不同的语法成分,最后再综合起来。2.3语法分析程序的数据流图词法分析程序把源程序变成TOKEN串,存放在TOKEN文件中。这个文件是Sample语言语法分析程序的输入文件。语法分析的任务就是根据语言的语法定义(产生式)判断输入的token文件是否符合语法规则的定义,如果符合某个语法成分的定义,就是正确的定义。图2-1语法分析
3、程序的顶层数据流图语法分析的过程就是不断地读入token文件中的单词,根据不同的语法单位(语句),使用不同的方法进行分析,直到token文件的结束。源程序的组织结构(去掉了注释等无用部分)是:程序头部,说明部分和可执行部分,所以要分别进行处理。Sample语言的特点是每个部分有一个前导词,程序头部以program开头,变量说明以var开头,常量说明是以const开头的,从begin开始就是可执行语句,可执行语句分为五种:for语句(以for语句开头),while语句(以while开头),if语句(以if
4、开头),repeat语句(以repeat编译原理实验指导书开头),赋值语句(以标识符开头)。每当读到前导词,表明一个新的语法结构的开始,以此识别该语法单位是否符合定义。下图是语法分析程序的详细数据流图。图2-2语法分析程序的详细数据流图在语法分析过程中,各种语句的处理可以采用不同的语法分析方法,实验中希望能够使用两种语法制导翻译技术:一是对各个语句和布尔表达式采用递归下降翻译法,二是对算术表达式采用自底向上的算符优先分析方法。根据采取的语法分析方法不同,就得到不同的详细数据流图。如下图是使用算符优先分析
5、方法的数据流。图2-3算符优先分析的数据流图编译原理实验指导书图2-4算符优先分析的详细数据流图但不管使用哪种语法分析方法,必须根据语法定义,下面详细说明变量说明的处理方法。变量说明以var开头,格式如下:<变量说明>::=var<变量定义>
6、ε<变量定义>::=<标识符表>:<类型>;
7、<标识符表>:<类型>;<变量定义><标识符表>::=<标识符>,<标识符表>
8、<标识符>处理流程如图:下面是根据该流程采用递归下降的方法识别变量说明的算法描述。当读入前导词var后,再读入一个token字,表明它是变
9、量名称,调用下面的varst处理一行变量说明,当处理完一行(读入;)后,下一行可能仍是变量说明,也可能是begin开始的可执行程序部分,否则就是出错。voidvarst(char*token)/*处理变量说明,读入var后进入该过程*/{while(1){if(!isidentifier(token)return–1;token=getnexttoken();/*取下一个token字*/if(token是",")token=getnexttoken();/*取下一个token字*/elseif(toke
10、n是":")break;elseerror("错误:变量名后只能出现:和,")}type=getnexttoken();/*取出下一个token字,放入type中*/if(type不是"integer","char","real","bool")error("变量说明错");/*只能是这几种基本类型,若有其它类型,再加入*/token=getnexttoken();/*取出下一个token字*/if(token不是";")error("缺少;");/*处理完一行变量说明*/token=getnextto
11、ken();/*取出下一个token字*/if(isidentifier(token))varst(token);/*如果读入是标识符,继续处理变量说明*/elseif(token是"begin"))return;/*结束本函数的处理,转入处理可执行程序部分*/编译原理实验指导书elseerror("语法错误:缺少BEGIN,或变量说明出错");}分析各种语法结构(算术表达式、逻辑表达式、说明语句、赋值语句、IF语句、FOR语句、REPEA
此文档下载收益归作者所有