编译原理课程设计C语言编译器文档格式.docx
《编译原理课程设计C语言编译器文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计C语言编译器文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
.
编程语言为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"
~
}
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.*/
{returk;
re9;
!
"
!
/*umodv*/
语法分析用例:
正确用例:
()
/*Aprogramtoperformselectionsortona10
elementarray.*/
intx[10];
intminloc(inta[],intlow,inthigh)
{inti;
intk;
k=low;
x=a[low];
i=low+1;
while(i<
high)
{if(a[i]<
x)
%
{x=a[i];
k=i;
i=i+1;
returnk;
voidsort(inta[],intlow,inthigh)
,
intk;
i=low;
high-1)
{intt;
k=minloc(a,i,high);
t=a[k];
a[k]=a[i];
a[i]=t;
、
voidmain(void)
i=0;
10)
*
{x[i]=input;
sort(x,0,10);
{output(x[i]);
intgcd(intu,intv
if(v==0returnu;
intx,inty;
词法分析结果输出:
正确结果:
C:
\DocumentsandSettings\计算机学院专业实验室\桌面\compiler\Debug>
compilersou
C-COMPILATION:
1:
/*AprogramtoperformEucild'
2:
3:
intgcd(intu,intv)
reservedword:
int
ID,name=gcd
ID,name=u
ID,name=v
4:
5:
if
^
==
NUM,val=0
return
;
6:
`
else
/
7:
8:
9:
10:
voidmain(void)
void
ID,name=main
11:
12:
ID,name=x
ID,name=y
13:
=
ID,name=input
;
14:
ID,name=output
¥
15:
16:
17:
EOF
错误结果:
compilersour
【
{returk;
ERROR:
ID,name=returk
ID,name=re
NUM,val=9
语法分析的结果输出:
Syntaxtree
:
Int
Id:
x
Vark:
10
minloc
[
Hanshu
a
-1
low
high
Hanshuti
i
k
Assignto:
》
Op:
+
Const:
1
While
If
Return
Void
sort
@
—
t
main
0
input
$
output
MicrosoftWindowsXP[版本版权所有1985-2001MicrosoftCorp.
\DocumentsandSettings\计算机学院专业实验室>
cd桌面\compiler\Debug
Syntaxerroratline4:
unexoectedtoken->
Syntaxerroratline5:
Syntaxerroratline12:
Syntaxerroratline16:
codeendbefore
gcd
u
v
y
z
4.总结
收获:
1、熟悉C语言的结构、指针、文件方面的使用。
2、学会用startUml构造状态图,及用switch-case结构实现状态转换实现词法分析。
3、学会用递归下降方法实现EBNF文法规则,进而实现语法分析。
4、熟悉构造编译器的步骤及程序实现的框架及部分方法。
不足:
1、程序语法实现部分只用了递归下降分析一种方法。
2、此程序框架与教材《编译原理及实践》附录BTiny编译器的程序框架相似。
3、递归下降分析方法手工实现应经验少程序逻辑错误多,调试费时久,不能保证程序的高健壮性。