词法分析程序实验报告
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函数结束
词法分析程序实验报告
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函数结束