已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1Basedata.h#ifndef _BASETYPE_H#define _BASETYPE_H#define FALSE 0#define TRUE 1#define SPACE 0x20#define BACKSPACE 0x08#define ENTER 0x0d#define ESC 0x1b#define TABLE 0x09 #define ENDFILE -1#endif2Symbol.h #ifndef _SYMBOL_H#define _SYMBOL_H#include #include #define WORDLEN 13 /保留字个数#define MAXIDLEN 50 /标识符最长长度#define SYMBOLNUM 32 /种别码个数typedef enum SYMBOL NOL,IDENT,NUMBER,PLUS,MINUS,TIMES,SLASH, ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQ,LPAREN, RPAREN,COMMA,SEMICOLON,PERIOD,BECOMES, BEGINSYM,ENDSYM,IFSYM,THENSYM,WHILESYM, WRITESYM,READSYM,DOSYM,CALLSYM,CONSTSYM, VARSYM,PROCSYM SYMBOL;/定义种别码void Getchar(void);/取下一个字符void Getbc(void);/如当前字符为白字符,则读字符至不为白字符时停止void Concat(void);/将当前字符加入token字void Retract(void);/回退一字符int Reserve(void);/判断token字中单词是否是保留字int Getsym(void);/从当前文件中识别出一单词,并给出其类型和值void Errorsym(void);/打印错误信息#endif3Symbol.c#include basedata.h#include symbol.h#include #include #include char *WORDWORDLEN=BEGIN,CALL,CONST,DO, END,IF,ODD,PROCEDURE, READ,THEN,VAR,WHILE, WRITE ;/保留字字符串表,用于将保留字种别码转为字符串输出SYMBOL WSYMWORDLEN=BEGINSYM,CALLSYM,CONSTSYM, DOSYM,ENDSYM,IFSYM,ODDSYM, PROCSYM,READSYM,THENSYM, VARSYM,WHILESYM,WRITESYM;/保留字种别码表char* SNAMESYMBOLNUM= NOL,IDENT,NUMBER,PLUS,MINUS,TIMES, SLASH,ODDSYM,EQL,NEQ,LSS,LEQ,GTR, GEQ,LPAREN,RPAREN,COMMA,SEMICOLON, PERIOD,BECOMES,BEGINSYM,ENDSYM,IFSYM, THENSYM,WHILESYM,WRITESYM,READSYM, DOSYM,CALLSYM,CONSTSYM,VARSYM,PROCSYM;/单词字符串表,用于将保留字种别码转为字符串输出SYMBOL sym;/最近已识的单词种别码char tokenMAXIDLEN+1;/最近已识别的单词int num;/最近已识别的数字值char ch;/最近已识别的字符int col=1,row=1;/当前行和列值FILE *fd;/指向待编译文件extern FILE *fout;/指向存放结果文件void Getchar(void) ch=fgetc(fd); if(ch!=EOF & ch!=n) col+; return;void Getbc(void) while(ch=SPACE |ch=TABLE |ch=n) if(ch=n) row+;col=1; Getchar();/为空字符则一直读至不为空字符void Retract(void) fseek(fd,-1l,SEEK_CUR); col-;void Concat(void) char temp2; temp0=ch;temp1=0; strcat(token,temp);int Reserve(void) int i,j; char temp60; j=strlen(token); for(i=0;ij;i+) tempi=toupper(tokeni);/将当前token字以大写形式存入temp中 tempi=0; for(i=0;i=WORDLEN) i=-1; return i;void Errorsym(void) fprintf(fout,There is error row: %5d, col: %5d,row,col);int Getsym(void) int k; int flag=TRUE; Getchar(); Getbc();/滤掉白字符 strcpy(token,); if(isalpha(ch) /以字母开头则是标识符 num=0; Concat(); Getchar(); while(isalnum(ch) Concat(); Getchar(); Retract();/由于超前搜索了,所以回退一个字符 k=Reserve();/判断此标识符是否是保留字 if(k!=-1) sym=WSYMk;/将保留字种别码存入sym中 else sym=IDENT;/将一般标识符种别码存入sym中/end else k!=-1;/end of if isalpha else if(isdigit(ch) /以数字开头则为无符号整数Concat();Getchar();while(isdigit(ch) Concat(); Getchar();if(isalpha(ch) flag=FALSE;while(isalnum(ch) Concat(); Getchar(); /end of flag=FALSE Retract();/回退 if(flag)/若是无符号整数,则将整数值存于num中 sym=NUMBER;num=atoi(token); /end of if isdigit else num=0; switch (ch) case +:Concat();sym=PLUS;break; case -:Concat();sym=MINUS;break; case *:Concat();sym=TIMES;break; case /:Concat();sym=SLASH;break; case (:Concat();sym=LPAREN;break; case ):Concat();sym=RPAREN;break; case =:Concat();sym=EQL;break; case #:Concat();sym=NEQ;break;/* ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQ,LPAREN, RPAREN,COMMA,SEMICOLON,PERIOD,BECOMES,*/ case ,:Concat();sym=COMMA;break; case .:Concat();sym=PERIOD;break; case ;:Concat();sym=SEMICOLON;break; case : Concat();Getchar(); if(ch!=)/若后不跟=,则回退sym=GTR;Retract(); elseConcat();sym=GEQ; break; case :Concat();Getchar(); if(ch!=)sym=LSS;Retract(); elseConcat();sym=LEQ; break; case :Concat();Getchar(); if(ch!=)flag=FALSE;Retract(); elseConcat();sym=BECOMES; break; default :Concat();flag=FALSE;break; /end of switch else char /end of else char return flag; 4Testsym.c#include basedata.h#include symbol.h#include extern char *WORDWORDLEN;extern int WSYMWORDLEN;extern char* SNAMESYMBOLNUM;extern SYMBOL sym;/last readed word type;extern char tokenMAXIDLEN+1;/last readed wordextern int num;/last readed num;extern char ch;/last readed char;extern int col,row;extern FILE *fd;FILE *fout;void Init(void);void Quit(void);void main() int flag; Init(); fprintf(fout,n TOKEN SYM NUM); doflag=Getsym();if(flag) fprintf(fout,n%10s %10s %d,token,SNAMEsym,num); else if(ch!=EOF) fprintf(fout,n%10s,token); Errorsym(); while(ch!=EOF);/反复调用Getsym()识别单词,将输出结果存入fout中 Quit();/=void Init(void) char temp30; printf(nPlease input your file name:); gets(temp); if (fd = fopen(temp,rt)= NULL) fprintf(stderr, Cannot o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年陕西省选调生招录备考题库(面向中国科学技术大学)及参考答案详解1套
- 2025徐汇区行政服务中心招聘会务主管备考题库含答案详解(精练)
- 2025重庆涪陵区义和街道工作委员会招聘备考题库及参考答案详解1套
- 浙江银行招聘-金华银行2026届校园招聘110人备考题库附答案详解(巩固)
- 九江市总工会2025年公开招聘工会社会工作者备考题库【25人】及答案详解(全优)
- 2025广西上林县应急管理局招聘编外专业森林消防队员4人备考题库附答案详解(达标题)
- 2025宁东基地管委会招聘党建指导员5人备考题库附答案详解(精练)
- 2026中国建设银行大连市分行校园招聘90人备考题库参考答案详解
- 2025四川遂宁顺邦安防服务有限公司招聘市公安局警务辅助人员16有备考题库附答案详解(满分必刷)
- 2025云南西双版纳勐海县消防救援局招聘消防文员1人备考题库含答案详解(预热题)
- 2025年《新闻传播》知识考试题库及答案解析
- 2025年中职航空服务(民航客运服务)试题及答案
- 2025年河北邯郸市复兴区公开招录联合治超站岗位人员20人考试笔试备考题库及答案解析
- 外来物种入侵事件应急预案
- Unit6知识点默写-2025-2026学年译林版七年级英语上册
- 洗井安全协议书模板
- 2026年武汉警官职业学院单招职业适应性测试题库及答案解析(夺冠系列)
- 仓库管理制度
- 老年人社工培训
- 暖冬无恙健康同行 - 冬季流感预防主题班会课件
- 大学生美学论文范文2500字
评论
0/150
提交评论