- 1、本文档共26页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)