编译原理课程设计C语言编译器.docx
《编译原理课程设计C语言编译器.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计C语言编译器.docx(21页珍藏版)》请在冰豆网上搜索。
编译原理课程设计C语言编译器
(
编译原理课程设计报告
课题名称:
C-语言编译器设计
提交文档学生姓名:
李杰
)
提交文档学生学号:
00
同组成员名单:
无
指导教师姓名:
金军
N不
指导教师评阅意见:
.
.
'
提交报告时间:
2010年6月10日
1.课程设计目标
实验建立C-编译器。
只含有scanner和parser部分。
2.分析与设计
(1)实现方法:
.
编程语言为C语言。
编程方法:
scanner部分根据DFA图用switch-case结构实现状态转换;parser部分用递归下降分析方法实现。
(2)扫描器:
C-惯用的词法
1、语言的关键字:
elseifintreturnvoidwhile
2、专用符号:
+-*/<<=>>===!
==;,()[]{}/**/
3、其他标记是ID和NUM,通过下列正则表达式定义:
ID=letterletter*NUM=digitdigit*letter=a|..|z|A|..|Zdigit=0|..|9
?
4、空格由空白、换行符和制表符组成。
空格通常被忽略,除了它必须分开ID、NUM关键字。
5.注释用通常的C语言符号/*...*/围起来。
注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。
注释不能嵌套
各单词的状态转换图(DFA图如下)词法结构见文件""中。
…
#
(3)分析器:
分析树结构见文件""中。
C-的BNF语法如下:
(4)代码设计说明:
#
程序结构:
语法分析函数parse通过调用词法分析函数getToken实现语法分析。
文件和函数的设计说明:
文件包含相应头文件,及main函数的实现;文件包含符号表和分析数的数据结构及在其它文件中使用的变量;文件和实现与词法分析和语法分析输出相关的函数printToken和printTree,以及分析树节点初始化相关的函数newStmtNode,newExpNode(Expkind)和copyString;文件和实现词法分析,主要函数为getToken;文件和实现语法分析,函数为与文法规则对应的函数。
关键数据结构
3.程序代码实现
文件代码如下:
==NULL)
{strcat(pgm,".tny");}
。
source=fopen(pgm,"r");
if(source==NULL)
{
fprintf(stderr,"file%snotfound\n",pgm);
return-1;
}
listing=stdout;
fprintf(listing,"\nC-COMPILATION:
%s\n",pgm);
~
}
else
{EOF_Flag=TRUE;
returnEOF;
}
}
elsereturnlineBuf[linepos++];
}
<
tr))
{
returnreservedWords[i].tok;
}
}
returnID;
}
】
TokenTypegetToken(void)
{
*/
intgcd(intu,intv)
{
if(v==0)returnu;
elsereturngcd(v,u-u/v*v);
/*u-u/v*v==umodv*/
】
}
voidmain(void)
{
intx;inty;
x=input();y=input();
output(gcd(x,y));
}
-
>=;<=;==;!
=;
错误用例:
/*AprogramtoperformEucild's
Algorithmtocomputegcd.*/
intgcd(intu,intv)
{returk;re9;
!
if(v==0)returnu;
"elsereturngcd(v,u-u/v*v);
!
/*umodv*/
}
语法分析用例:
正确用例:
()
/*Aprogramtoperformselectionsortona10
elementarray.*/
intx[10];
-
intminloc(inta[],intlow,inthigh)
{inti;intx;intk;
k=low;
x=a[low];
i=low+1;
while(i{if(a[i]%
{x=a[i];
k=i;}
i=i+1;
}
returnk;
}
voidsort(inta[],intlow,inthigh)
,
{inti;intk;
i=low;
while(i{intt;
k=minloc(a,i,high);
t=a[k];
a[k]=a[i];
a[i]=t;
、
i=i+1;
}
}
voidmain(void)
{inti;
i=0;
while(i<10)
*
{x[i]=input;
i=i+1;}
sort(x,0,10);
i=0;
while(i<10)
{output(x[i]);
i=i+1;}
}
#
错误用例:
/*AprogramtoperformEucild's
Algorithmtocomputegcd.*/
intgcd(intu,intv
{
if(v==0returnu;
elsereturngcd(v,u-u/v*v);
/*u-u/v*v==umodv*/
~
}
voidmain(void)
{
intx,inty;
x=input();y=input();
output(gcd(x,y));
}
、
>=;<=;==;!
=;
词法分析结果输出:
正确结果:
C:
\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>compilersou
C-COMPILATION:
1:
/*AprogramtoperformEucild's
!
2:
Algorithmtocomputegcd.*/
3:
intgcd(intu,intv)
3:
reservedword:
int
3:
ID,name=gcd
3:
(
3:
reservedword:
int
3:
ID,name=u
3:
~
3:
reservedword:
int
3:
ID,name=v
3:
)
4:
{
4:
{
5:
if(v==0)returnu;
5:
reservedword:
if
5:
(
^
5:
ID,name=v
5:
==
5:
NUM,val=0
5:
)
5:
reservedword:
return
5:
ID,name=u
5:
;
6:
elsereturngcd(v,u-u/v*v);
`
6:
reservedword:
else
6:
reservedword:
return
6:
ID,name=gcd
6:
(
6:
ID,name=v
6:
6:
ID,name=u
6:
-
`
6:
ID,name=u
6:
/
6:
ID,name=v
6:
*
6:
ID,name=v
6:
)
6:
;
7:
/*u-u/v*v==umodv*/
^
8:
9:
}
9:
}
10:
voidmain(void)
10:
reservedword:
void
10:
ID,name=main
10:
(
10:
reservedword:
void
<
10:
)
11:
{
11:
{
12:
intx;inty;
12:
reservedword:
int
12:
ID,name=x
12:
;
12:
reservedword:
int
-
12:
ID,name=y
12:
;
13:
x=input();y=input();
13:
ID,name=x
13:
=
13:
ID,name=input
13:
(
13:
)
;
13:
;
13:
ID,name=y
13:
=
13:
ID,name=input
13:
(
13:
)
13:
;
14:
output(gcd(x,y));
)
14:
ID,name=output
14:
(
14:
ID,name=gcd
14:
(
14:
ID,name=x
14:
14:
ID,name=y
14:
)
¥
14:
)
14:
;
15:
}
15:
}
16:
>=;<=;==;!
=;!
16:
>=
16:
;
16:
<=
%
16:
;
16:
==
16:
;
16:
!
=
16:
;
17:
EOF
错误结果:
`
C:
\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>compilersour
C-COMPILATION:
1:
/*AprogramtoperformEucild's
2:
Algorithmtocomputegcd.*/
3:
intgcd(intu,intv)
【
3:
reservedword:
int
3:
ID,name=gcd
3:
(
3:
reservedword:
int
3:
ID,name=u
3:
3:
reservedword:
int
3:
ID,name=v
!
3:
)
4:
{returk;re9;
4:
{
4:
ERROR:
4:
ID,name=returk
4:
;
4:
ID,name=re
4:
NUM,val=9
。
4:
;
5:
!
if(v==0)returnu;
5:
ERROR:
!
5:
reservedword:
if
5:
(
5:
ID,name=v
5:
==
5:
NUM,val=0
…
5:
)
5:
reservedword:
return
5:
ID,name=u
5:
;
6:
"elsereturngcd(v,u-u/v*v);
6:
ERROR:
"
6:
reservedword:
else
6:
reservedword:
return
~
6:
ID,name=gcd
6:
(
6:
ID,name=v
6:
6:
ID,name=u
6:
-
6:
ID,name=u
6:
/
;
6:
ID,name=v
6:
*
6:
ID,name=v
6:
)
6:
;
7:
/*umodv*/
8:
}
8:
}
*
9:
EOF
C:
\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>
语法分析的结果输出:
正确结果:
C:
\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>compilersour
"
C-COMPILATION:
Syntaxtree
:
Int
Id:
x
Vark:
10
Int
Id:
minloc
[
Hanshu
Int
Id:
a
Vark:
-1
Int
Id:
low
Int
Id:
high
¥
Hanshuti
Int
Id:
i
Int
Id:
x
Int
Id:
k
Assignto:
k
》
Id:
low
Assignto:
x
Id:
a
Id:
low
Assignto:
i
Op:
+
Id:
low
Const:
1
。
While
Op:
<
Id:
i
Id:
high
Hanshuti
If
Op:
<
Id:
a
(
Id:
i
Id:
x
Hanshuti
Assignto:
x
Id:
a
Id:
i
Assignto:
k
Id:
i
<
Assignto:
i
Op:
+
Id:
i
Const:
1
Return
Id:
k
Void
Id:
sort
(
Hanshu
Int
Id:
a
Vark:
-1
Int
Id:
low
Int
Id:
high
@
Hanshuti
Int
Id:
i
Int
Id:
k
Assignto:
i
Id:
low
While
—
Op:
<
Id:
i
Op:
-
Id:
high
Const:
1
Hanshuti
Int
Id:
t
》
Assignto:
k
Id:
minloc
Id:
a
Id:
i
Id:
high
Assignto:
t
Id:
a
Id:
k
;
Assignto:
a
Id:
a
Id:
i
Assignto:
a
Id:
t
Assignto:
i
Op:
+
Id:
i
》
Const:
1
Void
Id:
main
Hanshu
Void
Hanshuti
Int
Id:
i
,
Assignto:
i
Const:
0
While
Op:
<
Id:
i
Const:
10
Hanshuti
Assignto:
x
'
Id:
input
Assignto:
i
Op:
+
Id:
i
Const:
1
Id:
sort
Id:
x
Const:
0
$
Const:
10
Assignto:
i
Const:
0
While
Op:
<
Id:
i
Const:
10
Hanshuti
】
Id:
output
Id:
x
Id:
i
Assignto:
i
Op:
+
Id:
i
Const:
1
~
错误结果:
MicrosoftWindowsXP[版本版权所有1985-2001MicrosoftCorp.
C:
\DocumentsandSettings\计算机学院专业实验室>cd桌面\compiler\Debug
C:
\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>compilersour
C-COMPILATION:
>>>Syntaxerroratline4:
unexoectedtoken->
{
>>>Syntaxerroratline5:
unexoectedtoken->
reservedword:
return
、
>>>Syntaxerroratline12:
unexoectedtoken->
reservedword:
int
>>>Syntaxerroratline16:
codeendbefore
Syntaxtree
:
Int
Id:
gcd
Hanshu
Int
Id:
u
Int
Id:
v
Hanshuti
If
Op:
==
Id:
v
Const:
0
Return
Id:
u
Return
Id:
gcd
Id:
v
Op:
-
Id:
u
Op:
*
Op:
/
Id:
u
Id:
v
Id:
v
Void
Id:
main
Hanshu
Void
Hanshuti
Int
Id:
x
Int
Id:
y
Int
Id:
z
Assignto:
x
Id:
input
Assignto:
y
Id:
input
Id:
output
Id:
gcd
Id:
x
Id:
y
C:
\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>
4.总结
收获:
1、熟悉C语言的结构、指针、文件方面的使用。
2、学会用startUml构造状态图,及用switch-case结构实现状态转换实现词法分析。
3、学会用递归下降方法实现EBNF文法规则,进而实现语法分析。
4、熟悉构造编译器的步骤及程序实现的框架及部分方法。
不足:
1、程序语法实现部分只用了递归下降分析一种方法。
2、此程序框架与教材《编译原理及实践》附录BTiny编译器的程序框架相似。
3、递归下降分析方法手工实现应经验少程序逻辑错误多,调试费时久,不能保证程序的高健壮性。