资源简介

扩充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

评论

共有 条评论