词法分析程序.doc_第1页
词法分析程序.doc_第2页
词法分析程序.doc_第3页
词法分析程序.doc_第4页
词法分析程序.doc_第5页
已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论