C语言词法分析小程序———焦童
沈阳航空航天大学
编 译 实 验 报 告
实验报告名称:C语言小子集的词法分析程序
院(系):计算机学院
专 业:计算机科学与技术
班 级学 号:2012040101064
姓 名:焦童
一.实验要求:
(1)功能:实现 C 语言小子集程序的词法分析。
(2)输入: c 语言小子集的程序片段。
(3)输出:单词序列。
二.单词的属性和表格
单词的属性主要分为五大部分:
1. 关键字,是由程序语言定义的具有固有意义的标示符。有时称为保留字或基
本字。如:int,float,double,char 等。
2. 标识符,用来表示各种名字,如变量名,数组名等。
3. 常量, 常量的类型一般有整型,实型,布尔型,文字型等等。
4. 运算符,如 +,-,*,/,%等。 5. 界符 ,如逗号,分号,括号等等。
表 1 C 语言小子集的定义表
种别码符号种别码符号种别码符号0无定义1主函数2无符号实数3普通标示符4关键字5界符6运算符7自增运算符8自减运算符9类型标识符10区域运算符总控流程图
Y
N
四.测试运行
先输入源代码文件地址
文件源代码如下
显示经过词法分析
源代码
#include
#include
#include
#include
char *Key[10]={"main","void","int","char","printf","scanf","else","if","return"};
char Word[20],ch;
int IsAlpha(char c) { //判断是否为字母
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))
return 1;
else
return 0;
}
int IsNum(char c){ //判断是否为数字
if(c>='0'&&c<='9') return 1;
else return 0; }
int IsKey(char *Word){ //识别关键字函数
int m,i;
for(i=0;i<9;i++){
if((m=strcmp(Word,Key[i]))==0)
{
if(i==0)
return 2;
return 1;
}
}
return 0;
}
void scanner(FILE *fp){ //扫描函数
char Word[20]={'\0'};
char ch;
int i,c;
ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符
if(IsAlpha(ch)){ //判断该字符是否是字母
Word[0]=ch;
ch=fgetc(fp);
i=1;
while(IsNum(ch)||IsAlpha(ch)){ //判断该字符是否是字母或数字
Word[i]=ch;
i++;
ch=fgetc(fp);
}
Word[i]='\0'; //'\0' 代表字符结束(空格)
fseek(fp,-1,1); //回退一个字符
c=IsKey(Word); //判断是否是关键字
if(c==0)
printf("%s\t <3 普通标识符>\n\n",Word);//不是关键字
else if(c==2)
printf("%s\t <1 主函数>\n\n",Word);
else
printf("%s\t <4 关键字>\n\n",Word);
}//输出关键字
else //开始判