资源简介
本程序能成功识别检测程序中的每一个单词。检测程序中事先定义的关键字、实现过程或者在检测程序中定义的变量,本程序将一二元组输出。否则,本程序将会统一将其归类为undeclared identifier。
该程序是linux平台下的,若在Windows下只需将头文件unistd.h 改为io.h
代码片段和文件信息
#include
#include
#include
const char *keywords[]={“int““if““else““while““for““return“}; /*关键字(1)*/
const char *mark[]={“main““printf““%s““%d“}; /*标识符(2)*/
const char *calculate[]={“%““*““+““-““/““<““>““=““<=““>=““==“};/*运算符(4)*/
/*ASCLL) 37 42 43 45 47 60 62 61*/
const char *divide[]={“\“““(““)““““;““[““]““{““}“};/*界符(5)*/
/*ASCLL) 34 40 41 44 59 91 94 123 125*/
static int varflg=0var_count=0;
char varbuf[256][14]; /*用来存储定义过的变量*/
void judge(char *buffer){
int i;
if(buffer[0]==0x00)return; /*如果buffer为空,则立即返回*/
if(buffer[0]<=‘9‘ && buffer[0]>=‘0‘){ /*以数字开头的是常数*/
printf(“(3‘%s‘)\n“buffer);
return;
}
if(!strcmp(buffer“int“)){/*判断是何种形式的何种单词*/
printf(“(1‘%s‘)\n“buffer);
varflg=1; /*设置变量标志,在关键字int型的后面那个单词即认为是变量*/
}
else if(!strcmp(buffer“if“))printf(“(1‘%s‘)\n“buffer);
else if(!strcmp(buffer“else“))printf(“(1‘%s‘)\n“buffer);
else if(!strcmp(buffer“while“))printf(“(1‘%s‘)\n“buffer);
else if(!strcmp(buffer“for“))printf(“(1‘%s‘)\n“buffer);
else if(!strcmp(buffer“return“))printf(“(1‘%s‘)\n“buffer);
else if(!strcmp(buffer“main“))printf(“(2‘%s‘)\n“buffer);
else if(!strcmp(buffer“printf“))printf(“(2‘%s‘)\n“buffer);
else {
if(varflg==1){ /*变量*/
printf(“(2‘%s‘)\n“buffer);
var_count++;
for(i=0;i varbuf[var_count-1][i]=buffer[i];
}
else{
for(i=0;i if(!strcmp(buffervarbuf[i])){
printf(“(2‘%s‘)\n“buffer);
return;
}
}
printf(“undeclared identifier:‘%s‘\n“buffer);
}
}
return;
}
int main(){
FILE *fd;
int i;
int conflg=0;/*定义常量标志,两个““”之间的可认为是常量“%s““%d“除外*/
char cbuffer[256]forward=0x00;/*因光一个<>=无法判断是何种运算符,还得根据后一个符号判断,forward就是用来存储第一个读到的<>或=*/
fd=fopen(“input.txt““r“); /*打开input.txt文件做读操作*/
close(0); /*关闭标准输入*/
dup2(fileno(fd)0); /*标准输入重定向到fd*/
memset(buffer0x00sizeof(buffer));/*刷新缓冲区*/
while((c=getchar())!=EOF){
if((forward==‘>‘ || forward==‘<‘ || forward==‘=‘) && c!=‘=‘){ /*前一个符号是<>或者=*/
printf(“(4‘%c‘)\n“forward);
forward=0x00;
buffer[0]=c;
continue;
}
if(c==‘“‘){/*如果是双引号,则改变标志*/
conflg=(conflg+1)%2;
if(conflg==1){ /*如果是奇数个双引号,即字符串的开始标识*/
printf(“(5‘%c‘)\n“c);
memset(buffer0x00sizeof(buffer));
continue;
}
else{ /*if(conflg==0)字符串的结束标识*/
printf(“(3‘“);
for(i=0;i if(buffer[i]==‘%‘ && (buffer[i+1]==‘s‘ || buffer[i+1]==‘d‘))i++;
else printf(“%c“buffer[i]);
printf(“‘)\n“);
for(i=0;i if(buffer[i]==‘%‘ && (buffer[i+1]==‘s‘ || buffer[i+1]==‘d‘))
printf(“(2‘%c%c‘)\n“buffer[i]buffer[i+1]);
printf(“(5
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 127 2010-06-01 08:56 input.txt
文件 4765 2010-06-01 09:08 word_analysis.c
----------- --------- ---------- ----- ----
4892 2
相关资源
- 北邮-编译原理-词法分析
- 现代编译原理-C语言描述
- 编译原理实验报告+代码+使用说明
- 编译原理课程设计-C语言子集编译器
- 赋值语句翻译c语言实现四元式
- 编译原理用C++消除左递归
- 编译原理简易C编译器
- 实现语法分析器-编译原理
- 编译原理 LR分析器 c++代码
- 设计并实现TINYC语言的扫描程序TINYC
- LL(1)文法分析全过程(FIRST/FLLOW/S
- 编译原理 LR0项目集规范族的构造 L
- 山东大学编译原理实验源代码c++版
- 词法分析器有去除注释功能
- 自定义词法规则的词法分析器
- 简单函数绘图语言的解释器
- C语言词法分析程序
- Lex和Yacc从入门到精通.pdf
- 简易词法分析器——基于C语言
- LL(1)文法的实现-mfc-编译原理学习
- 词法分析C++源码
- 词法分析代码内有报告
- 编译原理LL1文法的mfc实现含消除左递
- 编译原理词法分析实验
- pl/0语言的编译器
- C++实现编译原理自动机、LL1文法、及
- 编译原理语义分析程序 c++实现
- 编译原理 课程设计 DAG 报告+源码C++版
- 编译原理课程设计----语法分析器(
- 编译原理简单的编译器源码
评论
共有 条评论