简单编译器编译原理课设中版.docx
《简单编译器编译原理课设中版.docx》由会员分享,可在线阅读,更多相关《简单编译器编译原理课设中版.docx(23页珍藏版)》请在冰豆网上搜索。
简单编译器编译原理课设中版
编译原理课程设计
简单编译器
学院(系):
电子信息与电气工程学部
学生姓名:
李梦珂
学号:
6
班级:
电计1101
同组人:
宫丽迪电计11016
陈笛电计11016
大连理工大学
DalianUniversityofTechnology
1词法分析(李梦珂6负责)
实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的明白得。
实验要求
设计、编制并调试一个词法分析程序,三人一组。
待分析的简单的词法
(1)关键字:
intifthenelsewhiledoreadwrite
所有的关键字都是小写。
(2)运算符和界符
:
:
==+-++--*/<<=!
=>>==;(){}#
(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式概念:
ID=letter(letter|digit)*
NUM=digitdigit*
(4)空格有空白、制表符和换行符组成。
空格一样用来分隔ID、SUM、运算符、界符和关键字,词法分析时期通常被忽略。
各类单词符号对应的类别码:
表各类单词符号对应的类别码
单词符号
种别码
单词符号
种别码
int
1
++
17
If
2
--
18
Then
3
:
=
19
else
4
<
20
while
5
!
=
21
do
6
<=
22
read
7
>
23
write
8
>=
24
lettet(letter|digit)*
10
==
25
dightdight*
11
;
26
=
12
(
27
+
13
)
28
-
14
\
30
*
15
!
31
/
16
:
32
33
{
35
}
36
词法分析程序的功能:
输入:
所给文法的源程序字符串。
输出:
二元组(syn,token或sum)组成的序列。
其中:
syn为单词类别码;
token为寄存的单词自身字符串;
sum为整型常数。
例如:
对源程序输入如下:
{
Intx,y;
X:
=2*y;
If(x>5)
Thenx:
=2*x+2/3;
}#
后经词法分析输出如下序列:
({35}(int1)(x10)(,33)(y10)(;26)(x10)……
词法分析程序的算法思想:
算法的大体任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其大体思想是依照扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
主程序示用意:
主程序示用意如下图。
其中初始包括以下两个方面:
⑴关键字表的初值。
关键字作为特殊标识符处置,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。
如能查到匹配的单词,那么该单词为关键字,不然为一样标识符。
关键字表为一个字符串数组,其描述如下:
Char*rwtab[6]={“int”,“if”,“then”,“else”,“while”,“do”,“read”,”write”};
图
(2)程序中需要用到的要紧变量为syn,token和sum
扫描子程序的算法思想:
第一设置3个变量:
①token用来寄存组成单词符号的字符串;②sum用来整型单词;③syn用来寄存单词符号的类别码。
扫描子程序要紧部份流程如下图。
图
词法分析程序的C语言程序源代码:
结果分析:
输入如下:
{
Intx,y;
X:
=2*y;
If(x>5)
Thenx:
=2*x+2/3;
}#
后经词法分析输出如下序列:
({35}(int1)(x10)(,33)(y10)(;26)(x10)……如下图:
图
总结:
词法分析的大体任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其大体思想是依照扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
通过本实验的完成,加倍加深了对词法分析原理的明白得。
2语法分析
实验目的
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
实验要求
利用C语言编制递归下降分析程序,并对简单语言进行语法分析。
待分析的简单语言的语法
用扩充的BNF表示如下:
⑴<程序>:
:
=<声明><语句串>;
⑵<语句串>:
:
=<语句>{;<语句>}
⑶<语句>:
:
=<赋值语句>
⑷<赋值语句>:
:
=ID:
=<表达式>
⑸<表达式>:
:
=<项>{+<项>|-<项>}
⑹<项>:
:
=<因子>{*<因子>|/<因子>
⑺<因子>:
:
=ID|NUM|(<表达式>)
实验算法结构
输入单词串,以“#”终止,若是是文法正确的句子,那么输出成功信息,打印“success”,不然输出“error”。
例如:
输入{
inta,x,b;
a:
=9;
x:
=2*3;
b:
=a+x
}
输出success!
语法分析程序的算法思想
(1)主程序示用意如下图。
图语法分析主程序示用意
(2)递归下降分析程序示用意如下图。
图递归下降分析程序示用意
(3)语句串分析进程示用意如下图。
图2-3语句串分析示用意
(4)statement语句分析程序流程如图、、、所示。
图statement语句分析函数示用意图expression表达式分析函数示用意
图term分析函数示用意图factor分析进程示用意
结果分析:
输入后输出success!
如下图:
图
输入后输出error如下图:
图
总结:
通过本次实验,了解了语法分析的运行进程,主程序大致流程为:
“置初值”→挪用scaner函数读下一个单词符号→挪用IrParse→终止。
递归下降分析的大致流程为:
“先判定是不是有声明”→不是那么“犯错处置”,假设是那么“挪用scaner函数”→挪用语句串分析函数→“判定是不是为end”→不是那么“犯错处置”,假设是那么挪用scaner函数→“判定syn=0&&kk=0是不是成立”成立那么说明分析成功打印出来。
不成立那么“犯错处置”。
3语义分析程序
实验目的:
通过上机实习,加深对语法制导翻译原理的明白得,把握将语法分析所识别的语法成份变换为中间代码的语义翻译方式。
实验要求:
采纳递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。
算法思想:
程序结构图
(1)主程序示用意如下图。
图语法分析主程序示用意
(2)递归下降分析程序示用意如下图。
(3)语句串分析进程示用意如下图。
图递归下降分析程序示用意
图语句串分析示用意
(4)statement语句分析程序流程如图、、、所示。
图statement语句分析函数示用意图expression表达式分析函数示用意
图term分析函数示用意
图2-7factor分析进程示用意
设置语义进程
(1)emit(char*result,char*ag1,char*op,char*ag2)
该函数的功能是生成一个三地址语句送到四元式表中。
四元式表的结构如下:
struct
{charresult[8];
charag1[8];
charop[8];
charag2[8];
}quad[20];
(2)char*newtemp()
该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,…
char*newtemp(void)
{char*p;
charm[8];
p=(char*)malloc(8);
k++;
itoa(k,m,10);
strcpy(p+1,m);
p[0]=’t’;
return(p);
}
函数lrparser在原先语法分析的基础上插入相应的语义动作:
将输入串翻译成四元式序列。
在实验中咱们只对表达式、赋值语句进行翻译。
简单赋值语句的翻译文法
S→ID↑n@ifD↓n↑p=E↑x@{若ID概念,则emit↓x(n’=’x);不然错误}
E↑x→T↑q{+T’↑r@{x=newtemp;emit↓x↓q↓r(x’=’q‘+’r)}}
T↑x→F↑q{*F’↑r@{x=newtemp;emit↓x↓q↓r(x’=’q‘*’r)}}
F↑x→ID↑n@{ifD↓n↑p;x=n}
F↑x→(E↑q)@{x=q}
F↑x→NUM↑lexval@{ifD↓lexval↑p;x=lexval}
ifD进程表示在符号表中查找标识符,假设不存在,那么报告“变量未概念而利用”的错误,假设存在,返回标识符在符号表中的入口地址p。
在执行语义规那么,输出四元式时,参数可用变量名、临时变量名和整常数代替。
newtemp()函数用来产生临时变量,如产生临时变量t1:
N=N+1;
“t”||ITOS(N);
emit()函数产生四元式代码:
例如用输出函数输出:
t1=q+r
例如:
翻译x=sum*(b+c);
四元式是:
t1=b+c
t2=sum*t1
x=t2;
在下面的递归下降语法制导翻译程序中,sym和symval读取词法分析结果中的单词二元式.如:
关于单词二元式(IDsum),则ID存入syn中,sum存入scaner中。
结果分析
总结:
通过本次实验,了解了语法分析的运行进程,主程序大致流程为:
声明->“置初值”→挪用scaner函数读下一个单词符号→挪用IrParse→四元式输出-》终止。
递归下降分析的大致流程为:
“先判定是不是有声明”→不是那么“犯错处置”,假设是那么“挪用scaner函数”→挪用语句串分析函数→“判定是不是为}”→不是那么“犯错处置”,假设是那么挪用scaner函数→“判定syn=0&&kk=0是不是成立”成立那么说明分析成功打印出来。
不成立那么“犯错处置”。