当前位置:文档之家› 编译原理课程设计词法分析

编译原理课程设计词法分析

elseif((ch>='0')&&(ch<='9'))
{
while((ch>='0')&&(ch<='9'))
{
sum=sum*10+ch-'0'; //ch中数字本身是当做字符存放的
ch=prog[p++];
}
if(ch=='.')
{
isDecimal=1;
ch=prog[p++];
while((ch>='0')&&(ch<='9'))
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
elseif((ch>='0')&&(ch<='9'))
{
IsNum:
if(isSignal==1)
{
//token[m++]='-';
}
while((ch>='0')&&(ch<='9'))
{
sum=sum*10+ch-'0'; //ch中数字本身是当做字符存放的
sum为整型常数。
例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:
(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……
四、
基本设计思路
基本字作为一类特殊的标识符来处理:识别出标识符,差基本字表,给出相应种别码。基本字表置初值:char *rwtab[6]={"begin","if","then","while","do","end"};(字符指针的数组)
>
23
>=
24
=
25
;
26
(
27
)
28
#
0
二、
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
三、
词法分析程序需具备词法分析的功能:
输入:所给文法的源程序字符串。(字符串以“#”号结束)
输出:二元组(syn,token或sum)构成的序列。
其中:syn为单词种别码;
token为存放的单词自身字符串;
ch=prog[p++];
}
sum=sum+decimal;
}
if(ch=='e'||ch=='E')
{
isExp=1;
ch=prog[p++];
if(ch=='-')
{
isNegative=1;
ch=prog[p++];
}
while((ch>='0')&&(ch<='9'))
{
//指数
index=index*10+ch-'0';
参考文献
[1] 张素琴,吕映芝等.编译原理[M].第2版.北京:清华大学出版社,2005.2
[2] 王雷,刘志成等.编译原理课程设计[M].北京:电子工业出版社,2002
[3] 何炎祥等.编译程序构造[M].武汉:武汉大学出版社,1988
[4] Holub piler Design in C[M].Prentice-Hall,1990
if(ch=='-')
{
isNegative=1;
ch=prog[p++];
}
while((ch>='0')&&(ch<='9'))
{
//指数
index=index*10+ch-'0';
ch=prog[p++];
}
if(isNegative)
sum=sum*pow(0.1,index);
else
sum=sum*pow(10,index);
{
//pow(x,y)计算x的y次幂
temp=(ch-'0')*pow(0.1,++count);
decimal=decimal+temp;
//AddToDec();
ch=prog[p++];
}
sum=sum+decimal;
}
if(ch=='e'||ch=='E')
{
isExp=1;
ch=prog[p++];
源程序代码
#include<stdio.h>
#include<string.h>
#include<math.h>
char prog[80]; //存放所有输入字符
char token[8]; //存放词组
char ch; //单个字符
int syn,p,m,n; //syn:种别编码
double sum;
}
p--;
syn=11;
}
输入与输出
词法分析程序需具备词法分析的功能:
输入:所给文法的源程序字符串。(字符串以“#”号结束)
输出:二元组(syn,token或sum)构成的序列。
其中:syn为单词种别码;
token为存放的单词自Βιβλιοθήκη 字符串;sum为整型常数。
程序运行结果
五、
用C语言实现。
六、
浮点数处理部分:
isDecimal=0;
break;
}
case -1:
printf("input error\n");
break;
default:
printf("(%2d,%8s)\n",syn,token);
}
}while(syn!=0);
3.浮点数的识别,先识别数字,再识别.,再识别数字,再识别E或e,再识别-,再识别数字。
int count;
int isSignal; //是否带正负号(0不带,1负号,2正号)
int isDecimal; //是否是小数
double decimal; //小数
int isExp; //是否是指数
int index; //指数幂
int isNegative; //是否带负号
double temp;
do{
ch=getchar();
prog[p++]=ch;
}while(ch!='#'); //输入以#号键结束
p=0;
do{
scanner(); //扫描,单词
switch(syn)
{
case 11:
if(isDecimal==0)
{
//加了1个强制类型转换
printf("(%2d,%8d)\n",syn,(int)sum);
do{
ch=getchar();
prog[p++]=ch;
}while(ch!='#'); //输入以#号键结束
2.输出到控制台:do…while循环中,扫描出单词后(扫描程序还会判断种别码syn)输出。
do{
scanner(); //扫描,单词
switch(syn)
{
case 11:
if(isDecimal==0)
{
printf("(%2d,%8d)\n",syn,(int)sum);
break;
}
else if(isExp==1)
{
printf("(%2d,%10.5e)\n",syn,sum);
isExp=0;
isDecimal=0;
break;
}
else if(isDecimal==1)
{
printf("(%2d,%8.4f)\n",syn,sum);
识别无符号整数是将数字串转换为无符号整数。我们在getchar()的时候是把数字当做字符从外部输出读取的。将数字串345#转换为整数:
(3*10+4)*10+5=345送到sum中
程序主要由2个函数组成,主函数main()和扫描子函数scanner()。扫描程序每次读取1个独立意义的单词符号,并判断单词类型。主程序做相应处理后做控制台输出。
break;
}
else if(isExp==1)
{
printf("(%2d,%10.5e)\n",syn,sum);
isExp=0;
isDecimal=0;
break;
}
else if(isDecimal==1)
{
printf("(%2d,%8.4f)\n",syn,sum);
isDecimal=0;
ch=prog[p++];
}
if(ch=='.')
{
isDecimal=1;
ch=prog[p++];
相关主题