编译原理--词法分析程序实验报告

词法分析程序实验报告

1、 实验内容

待分析的简单语言的词法:

关键字:begin if then end (小写)

运算符::= + - * / >

界符:; #

标识符:ID=letter (letter|digit)*

常数:NUM=digit digit*

要求编写词法分析程序,

键盘输入源程序(以#结束),输出单词符号的二元式。

(标识符1,常数2,关键字3,运算符4,界符5)

输入:

begin

x:=9;

if x>0 then x:=2*x+1/3;

end

#

输出:

3 begin

1 x

4 :=

2 9

5 ;

2、基本思想

首先输入字符串,存入一个字符数组中,然后再逐个读入字符,判断如果不为空、结束

符、换行符,则继续进行下面的判断,如果是其中三者中的一个,则读入下一个字符。

3、核心算法

核心算法在本程序中是while循环语句,首先检测当前的字符ch是否是‘#’,如果是就跳出循环,说明字符串分析结束,输出界符标示和字符‘#‘,如果则进入下面的分析。

如果ch是NULL或者换行符,则读入下一个字符,如果不是,继续分析。

如果ch是字母,存入text字符数组中,然后继续读入,直到读入的不是字母或者数字。则text数组中存放的是关键字或者标识符,将text中存放的字符数组和关键字比较,如果是关键字则输出关键字标示,如果不是,则输出标识符标示和字符串。读入下一个字符。

如果ch是数字,存入text字符数组中,然后继续读入,直到读入的不是字母数字。则text中存放的是数字,并输入数字标示和字符串。读入下一个字符。

如果ch是除‘:=’外的运算符,则输出运算符标示和字符。如果ch是‘:’,判断下一个字符是不是‘=’,如果是,则输出运算符标示和‘:=’,如果不是,则输出出错。读入下一个字符。

如果ch是界符,则输出界符标示和字符。读入下一个字符。

4、实验结果

实验结果如下:

begin

x:=9;

if x>0 then x:=2*x+1/3;

end#

运行结果如下:

5、实验心得

在第一次做这个实验的那个下午,做出来的没有现在这样完善,当时只能分析一行代码,现在可以换行输入。

其实这个实验最重要的就是分类比较复杂,分支比较多,如果不注意就会因为分类的问题而出错,把我好这一点就能掌握做好这个程序的精髓。

当然现在这个程序本身也存在着许多不完备的地方,比如不能读文件,而且对于查错也做的不是很好(我只是写了一下出错提示,不能显示哪一行出错了)......

如此而已......

程序源代码如下:#include

#include

#include

#include

#include

#include

char Getchar(char* &p){

char ch;

ch=*(p++);

return ch;

}

void main(){

char expression[100],*pExpression,text[20];

char ch=' ';

int i=0;

scanf("%c",&expression[0]);

while(expression[i]!='#'){

i=i+1;

scanf("%c",&expression[i]);

}//输入源程序串

pExpression=expression;

ch=Getchar(pExpression);

while(ch!='#'){//大循环开始

if(ch==' '||ch=='\t'||ch=='\n') ch=Getchar(pExpression);

else{

if(isalpha(ch)){//开头是字母

for(i=0;i

i=0;

while(isalpha(ch)||isdigit(ch))

{

text[i]=ch;

i++;

ch=Getchar(pExpression);

}

text[i]='\0';

if(!strcmp(text,"begin")||!strcmp(text,"if")||!strcmp(text,"then")||!strcmp(text,"end")) printf("3 类型是关键字 %s\n",text);

else printf("1 类型是标识符 %s\n",text);

}

else{ //是数字

for(i=0;i

text[i]='\0';

i=0;

if(isdigit(ch)){

while(isdigit(ch)){

text[i]=ch;

i++;

ch=Getchar(pExpression);

}

printf("2 类型是常数 %s\n",text);

}

else{//是运算符(除了运算符:=)

if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='')

{printf("4 类型是运算符 %c\n",ch);ch=Getchar(pExpression);}

else{//是运算符:=

if(ch==':'){ if(Getchar(pExpression)=='=') {printf("4 类型是运算符 :=\n");ch=Getchar(pExpression);}

else { printf("Error =\n"); ch=Getchar(pExpression);} }

else{//是界符

if(ch==';'||ch=='('||ch==')'){printf("5 类型是界符 %c\n",ch);ch=Getchar(pExpression);}

else {printf("Error\n"); ch=Getchar(pExpression);}

}//是界符结束

}//是运算符结束

}

}

}

}//while循环结束

printf("5 类型是界符 #\n");

}//mian函数结束


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn