编译原理 词法分析器 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.
词法分析器实验报告
专业资料word
.
实验目的:
设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。功能描述:
该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error!”,然后跳
过错误部分继续进行)
设计思想:
设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是所用的思想是根据状态转移表实现对单词的识别。首先构造一个保留字表,然后,每输入一个字符就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循环,最后根据所在的接受状态以及保留字表识别单词。
符号表:
专业资料word
.
记号类别属性值- ws -
保留1const
保留1var
保留1call
保留1begin
保留1if
保留1while
保留1do
保留1odd
保留1end
保留1then
保留1procedure 运算2=
运算2<
运算2<=
运算2<>
运算2>
运算2>=
运算2*
运算2+
运算2-
运算2/
运算:=2
标识3
ident
专业资料word
.
常数4 number 分隔符5 (
分隔5)
分隔;5
分隔,5
分隔.
5
状态转换图:①标识符及保留字:letter or digitt letter
Start
number:
②other
other
digit
digit
digit
digit
+ | -
E
start
digit
.
digit 65
1 0 2
3
4
digit
E
③关系操作符:
专业资料word
.
=start< ) <=, 2> )
<>, 2other
* )
(<,2=
)
=,
>
= )
>=, 2other
* (>, 2)
=
(:=,2)
④分隔符:专业资料word
.
;
start
( ; ,5)
(
( (,5)
)
( ),5),
.
( , ,5)
( . ,5)
算术运算符:⑤
+
start
( + ,2) -
( -,2)
*
/
( *,2)
( / ,2)
使用环境:visual c++6.0 Windows xp下的程序测试:专业资料word
.
input1 :
int a,b;
a=b+2;
input2:
while(a>=0)
do
7x=x+6.7E+23;
end;
input3:
begin:
x:=9
if x>0 then x:=x+1;
while a:=0 do
b:=2*x/3,c:=a;
end;
output2: output1: 4,2 output2: 5,;
3,int
1,while 3,a
5,( 5,,
3,a 3,b
2,>= 5,;
4,0 3,a
5,) 2,=
1,do 3,b
error line 3
2,+
专业资料word
.
output3: 3,c 2,= output3: 2,:= 3,x
1,begin 2,+ 3,a
error line 1 4,6.7E+23 5,;
3,x 5,; 1,end
2,:= 1,end 5,;
4,9 5,;
1,if 3,x
2,>
4,0
1,then
3,x
2,:=
3,x
2,+
4,1
5,;
1,while
3,a
2,:=
4,0
1,do
3,b
2,:=
4,2
3,x
2,/
4,3
5,,
专业资料word
.
测试结果与预期结果一致
源程序代码:
#include
#include
void main()
{
int i=0,j,k=0,state=1,f=0,linenum=1;
char
a[11][10]={const,var,call,egin,if,while,do,odd,end, hen,procedure}; char b,d[40]={\
freopen(input.txt,