编译原理课程设计Word文档下载推荐.docx
- 文档编号:8065468
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:19
- 大小:42.81KB
编译原理课程设计Word文档下载推荐.docx
《编译原理课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计Word文档下载推荐.docx(19页珍藏版)》请在冰点文库上搜索。
{ENDFILE,ERROR,
ELSE,IF,INT,RETURN,VOID,WHILE,
ID,NUM,
PLUS,MINUS,TIMES,OVER,LT,LTE,RT,RTE,EQ,NE,ASSIGN,SEMI,COMMA,LPAREN,R
PAREN丄Z,RZ,LD,RD丄C,RC
}TokenType;
(2)DFA9个状态
{START,INNE,INEQ,INLT,INRT,INID,INNUM,INOVER,INCOMMENT1,INCOM
MENT2,DONE}
StateType;
四、代码实现
1.查找保留字
函数TokenTypeSFindResvdc(har*s)须注意:
对Keyword先将keyWord归为ID类。
getToken时再匹配。
保留字数据结构如下:
staticstruct
{char*str;
TokenTypetok;
}reservedWords[MAXRESERVED]
={{"
else"
ELSE},{"
if"
IF},{"
int"
INT},{"
return"
RETURN},{"
void"
VOID},{"
while"
WHILE}};
staticTokenTypereservedLookup(char*s){inti;
for(i=0;
i<
MAXRESERVED;
i++)
if(!
strcmp(s,reservedWords[i].str))
returnreservedWords[i].tok;
returnID;
2.getToken代码设计说明:
1)以状态表为驱动,根据当前的状态以及当前字符来决定下一个状态。
2)嵌套case通过一个状态标记来标记当前DFA所处的状态,通过
case分支语句来执行每一个转移的情况,直观易懂,但是随着DFA
状态数量的增多,循环嵌套的程序代码就会变得很冗长。
3)实现DFA的核心代码及分析:
扫描程序的主函数为getToken,用的是嵌套case的方法,通过自定义一个状态枚举类型来标记当前所处
的DFA状态,并用字符数组tokenString来保存已经扫描过的字符,每次调用getToken函数的时候,当前状态都会被初始化为START状态,用while循环当当前状态不为DONE状态,就从输入流获取一个字符,并根据上面给出的DFA判断如何进行状态转移;
当当前状态为接收状态时,tokenString里面就是一个完整的token,于是将tokenString的内容打印到listing文件并返回tokenString里面的内容。
getToken函数调用getNextChar函数获取源文件中下一个字符,如果某些状态需要回溯一个字符,则调用ungetNextChar函数将已
经获取的字符释放出来等待下一个状态中重新获取。
GetToken函数中识别toker关键代码:
TokenTypegetToken(void){
inttokenStringIndex=0;
TokenTypecurrentToken;
StateTypestate=START;
intsave;
while(state!
=DONE)
{intc=getNextChar();
save=true;
switch(state)
{caseSTART:
if(isdigit(c))
{
state=INNUM;
}
elseif(isalpha(c))
state=INID;
elseif(c=='
!
'
)
state=INNE;
='
state=INEQ;
state=INRT;
state=INLT;
/'
)
state=INOVER;
elseif((c=='
)||(c=='
\t'
)||(c=='
\n'
))
save=false;
//state=START;
else
state=DONE;
switch(c)
{caseEOF:
save=false;
currentToken=ENDFILE;
break;
case'
+'
:
currentToken=PLUS;
-'
currentToken=MINUS;
*'
currentToken=TIMES;
;
currentToken=SEMI;
'
currentToken=COMMA;
('
currentToken=LPAREN;
)'
currentToken=RPAREN;
['
currentToken=LZ;
]'
currentToken=RZ;
{'
currentToken=LD;
}'
currentToken=RD;
default:
currentToken=ERROR;
break;
caseINNE:
if(c=='
currentToken=NE;
{ungetNextChar();
currentToken=ERROR;
caseINEQ:
currentToken=EQ;
currentToken=ASSIGN;
caseINRT:
currentToken=RTE;
currentToken=RT;
caseINLT:
currentToken=LTE;
currentToken=LT;
caseINNUM:
isdigit(c))
{ungetNextChar();
save=false;
state=DONE;
currentToken=NUM;
caseINID:
isalpha(c))
ungetNextChar();
save=false;
currentToken=ID;
caseINOVER:
if(c=='
state=INCOMMENT1;
tokenStringIndex=0;
//currentToken=LC;
currentToken=OVER;
caseINCOMMENT1:
){
state=INCOMMENT2;
elseif(c==EOF){save=false;
state=DONE;
//currentToken=ENDFILE;
caseINCOMMENT2:
if(c==7'
state=START;
elseif(c==EOF)
{state=DONE;
currentToken=ERROR;
elseif(c=='
state=INCOMMENT2;
caseDONE:
fprintf(listing,"
ScannerBug:
state=%d\n”,state);
currentToken=ERROR;
五、测试结果
测试小程序:
kelly.txt
1
+-*/
□+b-2+z;
inta(intbFintc[])<
if(a+b==c)d=e[1+2];
r色turn0;
-ti&
CMnp(u312sIQDwl«
lt
quuEflu气AIllklp右onpunLmsEM
常uuEflll片AIII
“p£
onporul2W2N:
7S0Au-H'
q4匚T〉祐4U-I-I"
9
wHr-lfln
AnEal
VECE
£
=召出#姙
name=a
n^ne=b
name=c
暂11辽务狂隽仃9:
S8888008S8
第
d=ell*21;
ID,name-d
=
ID-nane-e[
NUM,ual=l
+
nun,u^i=2
]
■
return0;
^9fy:
r-eser-ueduor-d=return第谕亍:
NUM,ual=0
當诰:
;
10=>
诰按柱意键继黒・・
程序运行结果分析:
如上图所示:
通过观察分析,发现程序已经能够成功识别关键字,如第-
行的“T,能成功识别出NUM,如第六行的“int”,成功识别出reservedword等。
另外,第三行为注释部分,已经被识别出并跳过。
同时,第四行为空,跳过。
通过以上实例运行结果可以得知,源文件中的各种token无论正确与否,
都能够被本扫描程序准确的扫描出来。
当能够获取正确的token时,就输出
token;
当遇到不能识别的token时,就输出一个ERROR:
token;
当遇至U注释的时候,就说明是注释,并绕过。
程序运行成功,词法分析正确。
六、小结
通过g本次实验,我学会了根据目标语言的词法规则构造正则表达式,并通过正则表达式构造出对应的DFA,并用代码实现DFA,能够用DFA来对C-语言进行词法分析。
更深入的理解了DFA的精髓,了解了用代码实现DFA的各种方法以及它们各自的特点。
同时,也深入理解并实践了编译原理词法分析的相关理论。
实验二:
一、实验目的及意义
1.实现基于Lex的C-语言的词法分析器
2.学会安装ParserGenerator2并且熟悉其环境
3.熟练配置MicrosoftVisualC++6.0,并实现与ParserGenerator2相应库的连接
4.学习基于Lex构造词法分析器的方法,以及实验过程
5.熟悉C-语言的各种Token
6.构造各种Token的正则表达式
7.设计词法分析器所需要的各种数据结构及Token识别成功后的动作
8.用ParserGenerator实现所设计的C-词法分析器
、实验环境
1.WindowsXP操作系统
2.编译环境ParserGenerator
3.VC6.0开发环境
三、分析与设计
letter=a|…|z|A|...|Z
Digit=0|…|9
(4)空白符号空白\n\t
2.C语言的词法正则表达式设计
keyWord,SpecialChar,ID,ErrorlD,Num,Annotation,Whitespace,Enter,End,Other
相关正则表达式如下所示:
KeyWordelse|if|int|return|void|while
SpecialChar"
+"
|"
_"
*"
「7"
="
=="
|
letter[A-Za-z]
digit[0-9]
ID{letter}{letter}*
ErrorID
{digit}+{letter}+({digit}|{letter})*|{letter}+{digit}+({digit}|{letter})*Num{digit}+
Annotation"
/*"
Whitespace[\t]+
3.Erro的处理
KtyVcrd|ifiutxeturrLvcLdl
Spec!
alChau•八|t二・「"
|匕二・「二二“|二•-m盯“|%“「尸
[0-?
ID{1sttbt]-£
leztar)*
ErrorID[digitF+{latterH(血”町I{1etWEh)*HlexterJfld-igitJf(tdigicjI{letter}j・Num(di
Etid:
cE3Fi->
OtLez
四、测试结果输出
测试小程序
test.txt
intmain(intij
tnt口臣町;
intk23GD;
/*ErrorTD6/
whiLfi(t-<
a[0])
i++;
return0;
输出结果:
:
lxne
1:
KeyUovd.
±
nt
1zLn记
ID
tneiin
1xne
d.
peci.-alCh-ai*
c
line
KeyWoi^d.
nt
1d_ne
_g
l£
ne
SpecialGh-ar
2
SpecieilCliaLi*
1zLoe
3
Ke
int
1±
nc
a.
Spec
L
江xne
Hum
50
xne
SliecietlGliar-
J
1£
rte
SpHCiAiCtlSLi'
|工
4
n"
t
fline
仪
Erroi'
ID:
R23GD
4:
peci^i.ACIiSi.1*
g跳过注釋
1ine
S;
p皂c:
i_0!
_Ch§
r*
l±
r>
e
4-±
-si±
Cli-a.^
〜/3
1Ine
5;
KeyWor-d.
viliile
5:
SpeciAiCliAi*
il
=IP
$工xne
Specx-^TCli-aii^
11ine
ne
il±
1d_ne
1inc
1xnt*line
隔到
FOFf
SpecialChai*Speci-alCykai-SpecialGbarSpeciailCBfifci*EeyWovd
Num
SpecialChar-
vetuvn
实验结果分析:
如上图黄色部分所示,程序已经能够成功识别keyword,ID,NUM,SpecialCh等
常规token类型,同时能识别出ErrorlD。
并能处理嵌套注释和文件末注释。
程序分析正确,运行成功
五、小结
通过lex词法分析,学会了pargen的环境配置与使用。
并对C-的正则表达式和lex的运行原理有一定的了解。
实验四:
C-语言语法分析器的手工构造
一、实验目的及意义
1•熟悉C-语言的语法规则;
2.使用上下文无关文法描述C-语言的语法规则;
3.设计语法分析器所需要的各种数据结构;
4.基于递归下降法实现C-语言的语法分析器,能够输入源程序,输出整个程序的语法树。
1.WindowsXP
2.MicrosoftVisualC++6.0
(1)C-的BNF语法描述如下:
1.program->
declaration-list
2.declaration-list->
declaration-listdeclaration|declaration
3.declaration->
var-declaration|func-declaration
4.var-declaration->
type-specifieIrD;
|type-specifierID[NUM];
5.type-specifier->
int|void
6.fun-declaration->
type-specifieIrD(params)compound-stmt
7.params->
param-list|void
8.param-list->
param-list,param|param
9.param->
type-specifieIrD|type-specifierID[]
10.compound-stmt->
{local-declarationsstatement-lis}t|empty
11.local-declarations->
local-declarationsvar-declaration|empty
12.statement-list->
statement->
liststatement|empty
13.statement->
expression-stmt|compound-stmt|selection-stmt|iteration-stmt|return-stmt
14.expression-stmt->
expressio;
n|;
15.selection-stmt->
if(expression)statement|
if(expression)statementelsestatement
16.iteration-stmt->
while(expression)statement
17.return-stmt->
return;
|returnexpression;
18.expression->
var=expression|simple-expression
19.var->
ID|ID[expression]
20.simple-expression->
additvie-expressionrelopaddtive-expression|additiveexpression
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计