资源简介
扩充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单片机的汽车防撞系统设计
相关资源
- 编译原理实验工具及参考源码(lex&
- 类pascal语言编译器(编译原理实验)
- 编译原理课程设计:词法语法编译器
- 中科院 编译原理 习题及解答
- 编译原理四元式和逆波兰式
- 《编译原理》清华大学版中的pl0扩充
- PL/0功能扩充break功能
- 编译词法分析器识别关键字常数和符
- SAMPLE (类pascal) 词法分析程序 C 版
- Delphi做的用于分析Pascal语言的词法分
- 编译原理LR(0)语法分析
- 编译原理中间代码生成程序
- 编译原理:LR分析程序
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- 编译原理语法分析器、词法分析器
- 山东大学编译原理PL/0语言 compiler实验
- FOR循环语句的翻译程序设计简单优先
- NFA的确定化NFA->DFA完整可运行代码
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 编译原理课设c编译器
- 赋值语句翻译四元式
- 河北工业大学编译原理实验代码及实
- 编译原理课程设计 while do循环语句翻
- 编译原理课程设计do——while简单优先
- 南开大学编译原理课件及作业
评论
共有 条评论