资源描述:
《编译原理实验.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验一:简易扫描器的DFA设计与实现实验原理:词法分析器的工作原理实验内容:用程序模拟实现一个简易扫描器的工作过程,从输入字符串到分析完以后以(CLASSVALUE的标准格式输出实验要求:1.源程序设计语言G[v标志符>]:<标志符>f<标志符><字母>
2、v标志符><下划线>
3、v标志符><数字>
4、<字母>
5、<下划线><常数>f<整数>V整数>f0
6、<非零数字><乏整数><泛整数>fV数字>
7、<数字><乏整数>
8、£V关系符>f<
9、<=
10、=
11、>
12、>=
13、<>V字母>A
14、B
15、C
16、D
17、E
18、F
19、G
20、H
21、I
22、J
23、K
24、L
25、M
26、N
27、O
28、P
29、Q
30、R
31、S
32、T
33、U
34、V
35、W
36、X
37、Y
38、Z
39、
40、a
41、b
42、c
43、d
44、e
45、f
46、g
47、h
48、i
49、j
50、k
51、l
52、m
53、n
54、o
55、p
56、q
57、r
58、s
59、t
60、u
61、v
62、w
63、x
64、y
65、zv非零数字>f1
66、2
67、3
68、4
69、5
70、6
71、7
72、8
73、9v数字>fv非零数字>
74、02.能识别下表所列的单词符号:单词符号类别编码类别码的助记符单词之值begin1BEGINend2ENDif3IFthen4THENelse5ELSE标识符6ID整数7INT数字串<8LT<=9LE=10EQ<>11NE>12GT>=13GE+14ADD-15SUB*16MUL/17DIV•18SEM(19LB)20RB3.能跳过源程序中的空白格:两个单词之间的任何空格,制表符,回车,
75、换行都是白空格,除了用来分隔单词以夕卜,没有意义;4.能跳过注释:1)接连出现的/*到下一次接连出现的*/之间的任何文字都是注释(多行);2)从某行接连出现的//到该行的结尾的任何文字都是注释(单行)。实验步骤:1.DFA及相关语义过程;2.流程图(或程序的基本框架);3.根据实验要求编写一个能够完全遍历整个词法分析程序的输入字符串;4.把课本P81程序3-4的函数编写完整。OUT(DIV,””1.DFA及相关语义过程START非/或非*非换行空格非空格空格8非*/*4换行歹OUT(SUB'”)OUTSEM”)OUT(LB””)OUT(RB,””)23OUT(
76、ADD,””2425OUT(MUL,””)I/I'/
77、1!129其他字母i!5非/6字母,d非字母和d<18十一=非=和>非dC=0时OUT(ID,TOKEN1012xd14亠亠"JOUT(EQ,2219-C不=0时OUT(c,”OUT(INT,”TOKEOUT(LE,””)OUT(NE,””)OUT(LT,””)OUT(GE,””)OUT(GT,””)2.流程图(或程序的基本框架)开始是否文件尾/N£//////除去空格换行符合无意义字符/:1:L卜1除去注释1£111识别ID或标识符1-I111识别数字1\\\识别符口号*3.代码#define
78、_CRT_SECURE_NO_WARNINGS#include#include#include#defineBEGIN1#defineEND2#defineIF3#defineTHEN4#defineELSE5#defineID6#defineINT7#defineLT8#defineLE9#defineEQ10#defineNE11#defineGT12#defineGE13#defineADD14#defineSUB15#defineMUL16#defineDIV17#defineSEM18#defi
79、neLB19#defineRB20charTOKEN[20];intlookup(char*);//查找标识符voidout(int,char*);//输岀扫描结果voidreport_error();//错误信息//externintlookup(char*);intlookup(char*temp){if(strcmp(temp,"begin")==0)returnBEGIN;elseif(strcmp(temp,"end")==0)returnENDelseif(strcmp(temp,"if")==0)returnIF;elseif(strcmp(te
80、mp,"then")==0)returnTHENelseif(strcmp(temp,"else")==0)returnELSEelsereturn0;}//externvoidout(int,char*);voidout(inta,char*s){switch(a){caseBEGIN:printf("<%s,%s>","BEGIN","begin"casebreak;ENDprintf("<%s,%s>","END","end");casebreak;IF:printf(break;"<%s,%s>","IF","if");caseTHENpr
81、intf(break;"<%s,%s>