编译原理_词法分析器_实验报告
词法分析器实验报告
实验目的:
设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 功能描述:
该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error!”,然后跳过错误部分继续进行) 设计思想:
设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是所用的思想是根据状态转移表实现对单词的识别。首先构造一个保留字表,然后,每输入一个字符就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循环,最后根据所在的接受状态以及保留字表识别单词。
符号表:
状态转换图:
①标识符及保留字:
letter or digitt
②number:
other
other
digit
E
digit
digit digit
③关系操作符:
④
分隔符:
(, 2)
(
(>=, 2)
* (>, 2)
(:=,2)
⑤
使用环境:
Windows xp下的visual c++6.0
程序测试: 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;
output1: 3,int 3,a 5,, 3,b 5,; 3,a 2,= 3,b 2,+ 4,2 5,;
output2: output2: 1,while 5,( 3,a 2,>= 4,0 5,) 1,do
error line 3 2,= 3,x 2,+
4,6.7E+23 5,; 1,end 5,;
output3: output3: 1,begin
error line 1 3,x 2,:= 4,9 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 2,* 3,x
测试结果与预期结果一致
源程序代码:
2,/ 4,3 5,, 3,c 2,:= 3,a 5,; 1,end 5,;
#include #include void main() {
int i=0,j,k=0,state=1,f=0,linenum=1; char
a[11][10]={
char b,d[40]={
freopen(
while(b!=EOF)/*判断所输入字符是否为结束符*/ {
if(b==' '||b=='\n'||b=='\t')/*滤过空格、换行等分隔符号*/ { if(b='\n') linenum++; b=getchar(); }
else if((b>='a'&&b='A'&&b
d[i++]=b; b=getchar();
while((b>='a'&&b='A'&&b='0'&&b
d[i++]=b; b=getchar(); }
for(j=0;j
if(k==0)/*在保留字表中没有查到该单词,是标识符*/ printf(
for(j=0;j
else if(b>='0'&&b
switch (state) { case 1:
if(b>='0'&&b
else if(b=='.') { state=2;d[i++]=b;b=getchar();} else if(b=='E') { state=4;d[i++]=b;b=getchar();} else state=7; break; case 2:
if(b>='0'&&b
if(b>='0'&&b
else if(b=='E') { state=4;d[i++]=b;b=getchar();} else state=7; break; case 4:
if(b=='+'||b=='-') { state=5;d[i++]=b;b=getchar();} else if(b>='0'&&b
if(b>='0'&&b
if(b>='0'&&b
case 7: f=1;break; case 8: f=1;break; } }
if(state==7&&(b'z')&&(b'Z')) printf(
else if(state==7&&(b>='a'&&b='A'&&b
{
while((b>='a'&&b='A'&&b
printf(
else printf(
else if(b==''*/ { d[i++]=b; b=getchar();
if(b=='='||b=='>') { d[i++]=b; b=getchar();
printf(
{ printf(
else if(b=='>')/*识别'>'和'>='*/ { d[i++]=b; b=getchar(); if(b=='=') { d[i++]=b; b=getchar();
printf(
{ printf(
else if(b==':')/*识别':='*/ { d[i++]=b; b=getchar(); if(b=='=') { d[i++]=b; b=getchar();
printf(
else printf(
else if(b=='*'||b=='+'||b=='-'||b=='/'||b=='=')/*识别运算符*/ { printf(
else if(b=='('||b==')'||b==','||b==';'||b=='.')/*识别分隔符*/ { printf(
{ printf(
实验心得:
此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分
析器原理的理解;熟悉了直接构造词法分析器的方法和相关原理,并学会使用c语言直接编写词法分析器;同时更熟练的掌握用c语言编写程序,实现一定的实际功能。