}
}
if(f==0)syntax();
else
{
td[t]='-1';
err(f);
}
}
具体执行函数:
len求字符串长度
index查找字符串中是否有ch返回ch位置
err输出错误和错误原因
print打印
6上机测试
6.1测试方法
在visualc++6.0下调试并通过.输入不同的语句进行测试,测试的主要目的是看程序能否正确判断条件语句是否正确,赋值语句的格式有没有错误以及最后结果输出的三地址是否正确。
6.2测试过程和结果
现用一下用例来测试本程序:
测试1:
输入一个最简单的dowhile循环语句,正确输入看能否得出正确结果,程序运行结果如下:
测试2:
输入一错误语句查看结果:
如下
程序不能认出so所以程序不能编译。
7结果
7.1研制过程
这次课程设计要求我用LL
(1)分析法来翻译while循环语句,这就要求对编译原理语法分析方面有一定的了解,熟悉各种语法分析的方法,特别是本题中所要求的LL
(1)法,需要弄清楚LL
(1)法的概念,过程,需要注意的地方等。
另外还需要对编程语言联系,才能编出符合要求的程序。
看到题目以后,首先将编译原理书上相关知识仔细看了一遍,不清楚的地方搞清楚特别是关系程序设计的部分。
然后参阅了编译程序构造方面的书籍,对编译程序的实现有了一定的了解。
最后是从编程语言方面,根据编译原理方面的知识,找出实现课程设计要求的解决方式,然后编写程序来实现。
编好以后,对其测试,找出其中存在的问题,不过程序不能像c++一样很好的实现对while的翻译,有些复杂的输入还是不能识别。
7.2本次课程设计的缺点
这个对while的编译程序不能像C++那样完美的编译,不能识别太过复杂的语句,循环的嵌套,带小括号的运算是这次课程设计的缺点。
7.3本次课程设计的收获
课程设计是不同于上机实验的一种更考验学生能力的方式,由于每个人的课设题目都不一样所以很大程度的消除了学生的依赖感。
本次课设我学到了很多。
首先,巩固了编译原理的知识。
为了做好这次课程设计,要求我必须重新复习一遍编译的课本,特别是需要实现的那部分原理。
除此之外,还有上网查询一些编译资料,和一些实际问题实现的例子,通过看别人实现的过程,学习实现的一些基本思路。
这次课程设计的题目是用LL
(1)进行while循环语句的语法分析,并输出三地址表达式.设计的特点是利用定义每个终极符和非终极符之间优先关系,来进行符号的移进与规约,如果栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。
这样使得程序简化,只需定义一个栈用来存放移进的字符,然后用栈顶指针指向它后与待移进字符比较优先级即可,设计简单.此设计的严重不足是只能进行一个固定句子的词法与语法分析,因为在定义优先关系时已固定了DO,和WHILE的每个字符之间的优先关系,且赋值表达式和条件式也已固定,所以只能进行本程序已约定好的语句.最大的收获是在提出一个难题以后,如果能比较顺手的解决的话,那是一件比较开心的事。
只是有些时候越想问题就会越多,也越难解决,那就得慢慢调试,慢慢推导了。
相信只要想得出,就能调得出,当然耐心是很重要的,花在上面的时间也是要多一点的。
其次,通过本次课程设计检验了我的数据结构的知识。
因为在语法分析中需要用到数据结构的一些知识,这就敦促我去重新温习数据结构中相关的知识。
8参考文献
(1)编译原理(第2版)清华大学出版社张素琴吕映芝等人著
本科生课程设计成绩评定表
班级:
姓名:
学号:
序号
评分项目
满分
实得分
1
学习态度认真、遵守纪律
10
2
设计分析合理性
10
3
设计方案正确性、可行性、创造性
20
4
设计结果正确性
40
5
设计报告的规范性
10
6
设计验收
10
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
2012年1月 日
源代码
#include
#defineMAX100
charX,a;
charVN[11]={'K','L','P','S','E','G','T','R','F','Q','\0'};
charVT[15]={'i','=','<','>','+','-','*','/','(',')','d','w',';','#','\0'};
charp[18][6]={"dLwS\0","SP\0",";SP\0","\0","iQE\0","TG\0","+TG\0","-TG\0","\0","FR\0",
"*FR\0","/FR\0","\0","(E)\0","i\0","=\0","<\0",">\0"};
charstack[MAX];
charqueue[MAX];
intsp,front;
intM[10][14]={{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1},
{1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,-1},
{4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1,8,8,8},
{9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12},
{14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1},
{-1,15,16,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
};
intf=0;
intcount=0;
intc=0;
chararr_i[MAX];
charvar[MAX];
inttd[MAX];//输出产生式序列
intt=0;
intopd=-1;
intopr=-1;
intid=0;
intd=0;
chararr[MAX][10];//存放待输出的三地址
intlen(charstr[])//求字符串长度
{
inti=0;
while(str[i]!
='\0')i++;
returni;
}
intindex(charch,charstr[])//查找字符串中是否有ch返回ch位置
{
inti=0;
while(str[i]!
='\0')
{
if(ch!
=str[i])i++;
elsebreak;
}
if(str[i]=='\0')return-1;
returni;
}
voiderr(intn)//输出错误和错误原因
{
if(n==1)
cout<<"字符不匹配"<elseif(n==2)
cout<<"字符没有出现在产生式终结符集VT中"<elseif(n==3)
cout<<"没有找到合适的候选产生式来做进一步推导"<else
cout<<"该句子是文法语言的句子!
"<}
voidprint()
{
cout<<"(";
if(count<10)cout<<'0';
cout<inti;
for(i=0;i<=sp;i++)cout<for(;i<=20;i++)cout<<"";
for(i=0;ifor(;queue[i]!
='#';i++)cout<cout<for(;i<=20;i++)cout<<"";
}
voidsemantic()
{
intj=0,k;
while(var[j]!
='\0')
{
if(var[j]=='=')
{
k=0;
for(j=j-1;(var[j]!
=';')&&(var[j]!
='}');j++,k++)
{arr[d][k]=var[j];}
arr[d][k]='\0';
d++;
j--;
}
if(var[j]=='<'||var[j]=='>')
{
k=0;
for(j=j-1;var[j]!
='}';j++,k++)
arr[d][k]=var[j];
arr[d][k]='\0';
d++;
j--;
}
j++;
}
}
voidsyntax()//语法分析
{
intn;
count++;
print();
X=stack[sp];
a=queue[front];
if(X=='#'&&a=='#')f=4;
if(X<'A'||X>'Z')
{
if(X==a)
{
sp--;
front++;
if(a!
='i')
{
if(a!
='d'&&a!
='w'&&a!
=';'&&a!
='#')
{
opr=index(a,VT);
}
elseif(a==';'||a=='w'||a=='#')
{
opr=-2;
}
cout<<'\t'<<'\''<}
else
{
opd=c;
cout<<'\t'<<'\''<