资源简介
扩充pl\0编译器设计之词法分析程序
内嵌函数:
void clearToken(); //清空token字符数组
int isSpace(); //空格
int isNewline(); //换行符
int isTab(); //Tab
int isLetter(); //字母
int isDigit(); //数字
int isColon(); //冒号 :
int isComma(); //逗号 ,
int isSemi(); //分号 ;
int isEqu(); //等号 =
int isPlus(); //加号 +
int isMinus(); //减号 -
int isDivi(); //除号 /
int isStar(); //乘号 *
int isLpar(); //左括号 (
int isRpar(); //右括号 )
int isLbrack(); //左中括号 [
int isRbrack(); //右中括号 ]
int isLbrace(); //左大括号 {
int isRbrace(); //右大括号 }
int isLss(); //小于号
int isPeriod(); //点号 .
int isQmark(); //单引号 '
int isDqmark(); //双引号 "
int isStringElement(); //字符串合法字符,ASCII码值为32,33,35-126的字符
void catToken(); //每次调用前把当前ch中的字符与token字符数组中的字符串联结
void retract(); //将读字符指针后退一个字符
void reserve(); //保留字
void lexical_error(); //错误处理过程
代码片段和文件信息
#include
#include
#include
#define MAX 100 //最大字符串长度
#define RESERVE_NUM 21 //保留字个数
FILE *fsrc *fobj; //词法分析源文件与分析结果保存文件
char ch; //读取当前字符到ch
char token[MAX]; //存放单词的字符串
int num = 1; //存放当前判断单词个数
char symbol[15]; //存放当前所识别的单词的类型
void start(); //启动程序
int getsym(); //词法分析子程序
void clearToken(); //清空token字符数组
int isSpace(); //空格
int isNewline(); //换行符
int isTab(); //Tab
int isLetter(); //字母
int isDigit(); //数字
int isColon(); //冒号 :
int isComma(); //逗号
int isSemi(); //分号 ;
int isEqu(); //等号 =
int isPlus(); //加号 +
int isMinus(); //减号 -
int isDivi(); //除号 /
int isStar(); //乘号 *
int isLpar(); //左括号 (
int isRpar(); //右括号 )
int isLbrack(); //左中括号 [
int isRbrack(); //右中括号 ]
int isLbrace(); //左大括号 {
int isRbrace(); //右大括号 }
int isLss(); //小于号 <
int isGre(); //大于号 >
int isPeriod(); //点号 .
int isQmark(); //单引号 ‘
int isDqmark(); //双引号 “
int isStringElement(); //字符串合法字符,ASCII码值为323335-126的字符
void catToken(); //每次调用前把当前ch中的字符与token字符数组中的字符串联结
void retract(); //将读字符指针后退一个字符
void reserve(); //保留字
void lexical_error(); //错误处理过程
void clean_filename(char*); //特殊系统文件路径处理
char reserves[RESERVE_NUM][15] = {
“array“ “begin“ “by“
“char“ “const“ “do“
“else“ “end“ “for“
“function“ “if“ “integer“
“of“ “procedure“ “read“
“real“ “then“ “to“
“var“ “while“ “write“
};
char reserves_tk[RESERVE_NUM][15] = {
“ARRAYTK“ “BEGINTK“ “BYTK“
“CHARTK“ “CONSTTK“ “DOTK“
“ELSETK“ “ENDTK“ “FORTK“
“FUNCTK“ “IFTK“ “INTTK“
“OFTK“ “PROCETK“ “READTK“
“FLOATTK“ “THENTK“ “TOTK“
“VARTK“ “WHILETK“ “WRITETK“
};
int main(){
start();
return 0;
}
void start(){
char filename[100];
//获取词法分析源文件
printf(“Please type in the file name to analyse:\n“);
gets(filename);
clean_filename(filename);
while((fsrc = fopen(filename “r“)) == NULL){
printf(“Open file %s failed!\nPlease type in the filename again:\n“ filename);
gets(filename);
clean_filename(filename);
}
//保存分析结果的文件
/* printf(“Please type in the file name to save result:\n“);
gets(filename);
while((fobj = fopen(filename “w“)) == NULL){
printf(“Open file %s failed!\nPlease type in the filename again:\n“ filename);
gets(filename);
}
*/
if((fobj = fopen(“11061156_token.txt“ “w“)) == NULL){
printf(“Open file 11061156_token.txt failed!\n“);
exit(1);
}
//对文件中的所有词进行词法分析
while(!feof(fsrc)){
ch = fgetc(fsrc);
getsym();
}
printf(“The result has been saved into 11061156_token.txt.\n“);
fclose(fobj);
fclose(fsrc);
}
int getsym(){ //词法分析子程序
clearToken();
while(isSpace() || isNewline() || isTab()) //读取字符,跳过空格、换行和Tab
ch = fgetc(fsrc);
if(isLetter()){ //判断当前字符是否是一个字母
while(isLetter() || isDigit()){ //将字符拼接成字符串
catToken();
ch = fgetc(fsrc);
}
retract(); //指针后退一个字符
reserve();
fprintf(fobj “%
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2013-11-21 19:05 LexicalAnalysis\
文件 526 2013-11-14 19:54 LexicalAnalysis\11061156_token.txt
目录 0 2013-11-16 23:01 LexicalAnalysis\Debug\
文件 172145 2013-11-16 23:01 LexicalAnalysis\Debug\LexicalAnalysis.exe
文件 191968 2013-11-16 23:01 LexicalAnalysis\Debug\LexicalAnalysis.ilk
文件 37714 2013-11-16 23:01 LexicalAnalysis\Debug\LexicalAnalysis.obj
文件 190920 2013-11-16 23:01 LexicalAnalysis\Debug\LexicalAnalysis.pch
文件 459776 2013-11-16 23:01 LexicalAnalysis\Debug\LexicalAnalysis.pdb
文件 33792 2013-11-16 23:01 LexicalAnalysis\Debug\vc60.idb
文件 53248 2013-11-16 23:01 LexicalAnalysis\Debug\vc60.pdb
文件 9469 2013-11-16 23:01 LexicalAnalysis\LexicalAnalysis.c
文件 4390 2013-11-13 00:21 LexicalAnalysis\LexicalAnalysis.dsp
文件 555 2013-11-12 20:24 LexicalAnalysis\LexicalAnalysis.dsw
文件 58368 2013-11-21 19:05 LexicalAnalysis\LexicalAnalysis.ncb
文件 48640 2013-11-21 19:05 LexicalAnalysis\LexicalAnalysis.opt
文件 264 2013-11-16 23:01 LexicalAnalysis\LexicalAnalysis.plg
目录 0 2013-11-14 19:53 LexicalAnalysis\Release\
文件 36864 2013-11-14 19:30 LexicalAnalysis\Release\LexicalAnalysis.exe
文件 23998 2013-11-14 19:30 LexicalAnalysis\Release\LexicalAnalysis.obj
文件 199196 2013-11-14 19:30 LexicalAnalysis\Release\LexicalAnalysis.pch
文件 25600 2013-11-14 19:30 LexicalAnalysis\Release\vc60.idb
文件 140 2013-11-14 18:44 LexicalAnalysis\test.txt
- 上一篇:小四轴源码
- 下一篇:基于51单片机的汽车防撞系统设计
相关资源
- 编译原理实验2-LL1分析法实现
- cmm解释器大作业
- 编译原理实验词法分析器、中间代码
- 编译原理课程设计--编译器
- 编译课设-词法分析,语法分析.zip
- 简易编译器,实现词法分析,语法分
- tiny词法分析,语法分析,语义分析,
- 编译原理 算符优先分析程序
- 编译原理-非递归预测实验-C代码实现
- 编译原理实验
- 编译原理自顶向下语法分析源代码+实
- 编译原理布尔表达式计算器
- LR语法分析器
- 编译原理语法制导翻译器 课程设计
- 编译原理——语法分析器
- 编译原理实验指导书
- 第四次上机—自下而上的语法分析
- 编译原理预测分析法语法分析程序
- 编译课程设计算数表达式转换成四元
- 广东工业大学编译原理试卷
- 编译原理词法分析器实验从文件读入
- 编译原理将简单程序翻译成四元式
- 《编译原理》实验 识别无符号数的词
- 编译原理语法分析器实验报告.doc版
- 在语法分析器的基础上构造的三地址
- 北方工业大学语法分析器 (1)完整实
- 编译原理实验词法,语法,语义
- 编译原理语法分析实验代码
- 编译原理三上机实验报告
- 预测分析表构造算法的程序实现
评论
共有 条评论