昆明理工大学信息工程与自动化学院学生实验报告
( 2013 — 2014 学年 第 1 学期 )
课程名称:编译原理 开课实验室:信自楼 442 2013年 12 月27日 年级、专业、班 实验项目名称 教师评语 学号 201110405137 姓名 成绩 语法分析器 指导教师 冯松 该同学是否了解实验原理: 该同学的实验能力: 该同学的实验是否达到要求: 实验报告是否规范: 实验过程是否详细记录: A.了解□ A.强 □ A.达到□ A.规范□ A.详细□ B.基本了解□ B.中等 □ B.基本达到□ B.基本规范□ B.一般 □ C.不了解□ C.差 □ C.未达到□ C.不规范□ C.没有 □ 教师签名: 年 月 日
一、 实验目的及内容
实验目的:编制一个语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析。
实验内容:在上机(一)词法分析的基础上,采用递归子程序法或其他适合的语法分析方法,实现其语法分析程序。要求编译后能检查出语法错误。
已知待分析的C语言子集的语法,用EBNF表示如下:
<程序>→PROGRAM<标识符>;<分程序> <程序>→<变量说明>BEGIN<语言表>END. <变量表>→VAR<变量说明表>
<变量说明表>→<变量表>:<类型>| <变量表>:<类型>;<变量说明表> <类型>→INTEGER|REAL
<变量表>→<变量>|<变量>,<变量表> <语句表>→<语句>|<语句>;<语句表>
-1-
<语句>→<赋值语句>|<条件语句>|
<条件语句>→IF<关系表达式>THEN<语句>ELSE<语句>
<算术表达式>→<项>|<算术表达式>+<项>|<算术表达式>-<项> <项>→<因式>|<项>*<因式>|<项>/<因式>
<因式>→<变量>|<常数>|(<算术表达式>)
<关系表达式>→<算术表达式><关系符><算术表达式> <变量>→<标识符>
<标识符>→<标识符><字母>|<标识符><数字>|<字母> <常数>→<整数>|<浮点数> <整数>→<数字>|<数字><整数> <浮点数>→.<整数>|<整数>.<整数> <关系符>→=|<|〈=|=|>|>=|<> <字母>→A|B|C|…|X|Y|Z <数字>→0|1|2|…|9
二、实验原理及基本技术路线图(程序流程图) 语法分析程序的算法思想
(1)主程序示意图如图1所示。
-2-
置初值 调用scaner读下一个单词符号 调用lrparser 结束 图1 语法分析主程序示意图
(2)递归下降分析程序示意图如图2所示。 (3)语句串分析过程示意图如图3所示。
是否
否
调用scaner
调用语句串分析程序
是否end?
否 调用scaner
syn=0&&kk=0? 打印分析成功 出错处理
(4)statement语句分析程序流程如图4、5所示。
调用term函数 否 是否标识符?
否 是否+ , -? 调用scaner 否 是 调用scaner 是否:=?
调用term函数 调用scaner 出错处理 出错处理 调用expression函数 图4 statement语句分析函数示意图 图5 expression表达式分析函数示意图
三、所用仪器、材料(设备名称、型号、规格等或使用软件) 1台PC以及VISUAL C++6.0软件
-3-
四、实验方法、步骤(或:程序代码或操作过程)
#include \#include \
char prog[100],token[8],ch;
char *rwtab[6]={\int syn,p,m,n,sum; int kk; factor(); expression(); yucu(); term(); statement(); lrparser(); scaner(); main() {
p=kk=0;
printf(\do
{ scanf(\ prog[p++]=ch; }while(ch!='#'); p=0; scaner(); lrparser(); getch(); }
lrparser() {
if(syn==1) {
scaner(); /*读下一个单词符号*/ yucu(); /*调用yucu()函数;*/ if (syn==6) { scaner();
if ((syn==0)&&(kk==0)) printf(\}
else { if(kk!=1) printf(\ kk=1; } }
else { printf(\kk=1; }
-4-
return; }
yucu() {
statement(); /*调用函数statement();*/ while(syn==26) {
scaner(); /*读下一个单词符号*/ if(syn!=6)
statement(); /*调用函数statement();*/ } return; }
statement() { if(syn==10) {
scaner(); /*读下一个单词符号*/ if(syn==18)
{ scaner(); /*读下一个单词符号*/
expression(); /*调用函数statement();*/ }
else { printf(\ kk=1; } }
else { printf(\ kk=1; }
return; }
expression() { term();
while((syn==13)||(syn==14))
{ scaner(); /*读下一个单词符号*/ term(); /*调用函数term();*/ }
return; }
term() { factor();
while((syn==15)||(syn==16))
{ scaner(); /*读下一个单词符号*/ factor(); /*调用函数factor(); */ }
return; }
-5-