四川大学Cminus语法分析器纯代码.doc

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
. . #includefstream #includeiostream #includestring #includestrstream using?namespace?std; #define?BUFLEN?256 #define?MAXLEN?256 #define?MAXTOKENLEN?40 #define?MAXCHILDREN?4 static?int?lineno; static?int?linepos?=?0;//读取的字符在lineBuf的位置 static?int?EOF_FLAG?=?false; static?int?bufsize?=?0;//lineBuf的长度 static?char?lineBuf[BUFLEN]; FILE?*?source; char?tokenString[MAXTOKENLEN+1]; string?output;//输出文件 enum?TokenType { ENDFILE,ERROR, IF,ELSE,INT,RETURN,VOID,WHILE, ID,NUM, ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI,LBRACKET,RBRACKET,LBRACE,RBRACE,COMMA, GT,GEQ,NEQ,LEQ }; enum?StateType { START,INASSIGN,INCOMMENT,INNUM,INID,DONE,PRECOMMENT,AFTERCOMMENT }; struct { char*?str; TokenType?tok; }ReserverWords[6] =?{?{if,IF},{else,ELSE},{int,INT},{return,RETURN},{void,VOID},{while,WHILE}?}; void?UnGetNextChar() { if?(!EOF_FLAG) linepos--; } int?GetNextChar() { if(!(lineposbufsize)) { lineno++; if(fgets(lineBuf,BUFLEN-1,source)) { bufsize=strlen(lineBuf); linepos=0; return?lineBuf[linepos++]; } else { EOF_FLAG=true; return?EOF; } } else { return?lineBuf[linepos++]; } } TokenType?ReservedLookUp(char?*?s) { int?i; for?(i?=?0;?i??6;?i++) { if(!strcmp(s,ReserverWords[i].str)) { return?ReserverWords[i].tok; } } return?ID; } TokenType?GetToken() { StateType?state?=?START;//初始状态为start bool?save; TokenType?CurrentToken; int?tokenStringIndex=0; string?assign=; while(state!=DONE) { int?c=GetNextChar(); save?=?true; switch?(state) { case?START: if?(isdigit(c)) { state?=?INNUM; } else?if?(isalpha(c)) { state?=?INID; } else?if?((c?==?)||(c==)||(c===)||(c==!)) { state?=?INASSIGN; assign+=char(c); } else?if?((c?==??)?||?(c?==?\t)?||?(c?==?\n)) save?=?false; else?if?(c?==?/) { save?=?false; state?=?PRECOMMENT; } else { state?=?DONE; switch?(c) { case?EOF: save?=?false; CurrentToken?=?ENDFILE;

文档评论(0)

hkfgmny + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档