#include
#include
#include
#include
using namespace std;
#define BUFLEN 256
#define MAXLEN 256
#define MAXCHILDREN 3
#define MAXTOKENLEN 40
static int lineno;
static int linepos = 0;//读取的字符在 lineBuf 的位置
static int EOF_FLAG = false;
static int bufsize = 0;//lineBuf 的长度
static char lineBuf[BUFLEN];
ofstream write;//输出文件
FILE * source;
char tokenString[MAXTOKENLEN+1];
//string OP;
string output;
enum TokenType
{
ENDFILE,ERROR,
IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE,
ID,NUM,
ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI,LBRACKET,RBRA
CKET
};
enum StateType
{
START,INASSIGN,INCOMMENT,INNUM,INID,DONE
};
struct
{
char * str;
TokenType tok;
}ReserverWords[8]
= { {"if",IF},{"then",THEN},{"else",ELSE},{"end",END},{"repeat",REPEAT},{"u
ntil",UNTIL},{"read",READ},{"write",WRITE} };
struct
{
char * str;
TokenType tok;
}Ope[6]
={{"=",EQ},{"<",LT},{"+",PLUS},{"-",MINUS},{"*",TIMES},{"/",OVER}};
struct
{
string str;
TokenType tok;
}Words[4]
= { {"If",IF},{"Repeat",REPEAT},{"Read",READ},{"Write",WRITE} };;
enum NodeKind
{
StmtK,ExpK
};
enum StmtKind
{
IfK,RepeatK,AssignK,ReadK,WriteK
};
enum ExpKind
{
OpK,ConstK,IdK
};
enum ExpType
{
Void,Integer,Boolean
};
struct TreeNode
{
struct TreeNode * child[MAXCHILDREN];
struct TreeNode * sibling;//兄弟结点
NodeKind nodekind;
int lineno1;
union
{
StmtKind stmt;
ExpKind exp;
}kind;
union
{
TokenType st;
TokenType op;
int val;
char* name;
}attr;
ExpType type;
};
void UnGetNextChar()
{
if (!EOF_FLAG)
linepos--;
}
TokenType ReservedLookUp(char * s)
{
int i;
for (i = 0; i < 8; i++)
{
if(!strcmp(s,ReserverWords[i].str))
{
return ReserverWords[i].tok;
}
}
return ID;
}
char* OpeLookUp(TokenType tk)
{
int i;
for(i=0;i<6;i++)
{
if(tk==Ope[i].tok)
{
return Ope[i].str;
}
}
}
string Change(TokenType tk)
{
int i;
for(i=0;i<4;i++)
{
if(tk==Words[i].tok)
{
return Words[i].str;
break;
}
}
}
int GetNextChar()
{
if(!(linepos
int c=GetNextChar();
save = true;
switch (state)
{
case START:
if (isdigit(c))
{
state = INNUM;
}
else if (isalpha(c))
{
state = INID;
}
else if (c == ':')
state = INASSIGN;
else if ((c == ' ') || (c == '\t') || (c == '\n'))
save = false;
else if (c == '{')
{
save = false;
state = INCOMMENT;
}
else
{
state = DONE;
//state=START;
switch (c)
{
case EOF:
save = false;
CurrentToken = ENDFILE;
break;
case '=':
CurrentToken = EQ;
break;
case '<':
CurrentToken = LT;
break;
case '+':
CurrentToken = PLUS;
break;
case '-':
CurrentToken = MINUS;
break;
case '*':
CurrentToken = TIMES;
break;
case '/':
CurrentToken = OVER;
break;
case '(':
CurrentToken = LPAREN;
break;
case ')':
CurrentToken = RPAREN;
break;
case ';':
CurrentToken = SEMI;
break;
CurrentToken = ERROR;
break;
default:
}
}
break;
case INCOMMENT:
save = false;
if (c == EOF)
{
state = DONE;
CurrentToken = ENDFILE;
}
else if (c == '}')
state = START;
break;
case INASSIGN:
state = DONE;
if (c == '=')
{
CurrentToken = ASSIGN;
UnGetNextChar();
save = false;
CurrentToken = ERROR;
}
else
{
}
break;
case INNUM:
if (!isdigit(c))
{
UnGetNextChar();
save = false;
state = DONE;
CurrentToken = NUM;
}
break;
case INID:
if (!isalpha(c))
{
UnGetNextChar();
save = false;
state = DONE;
CurrentToken = ID;
}
break;
case DONE:
default:
state = DONE;
CurrentToken = ERROR;
break;
}
if((save)&&(tokenStringIndex<=MAXTOKENLEN))
{
tokenString[tokenStringIndex++]=(char)c;
}
if(state==DONE)
{
tokenString[tokenStringIndex]='\0';
if(CurrentToken==ID)
{
CurrentToken=ReservedLookUp(tokenString);
}
}
}
return CurrentToken;
}
char * copyString(char *s)
{
int n;
char * t;
if (s==NULL)
{
return NULL;
}
n=strlen(s)+1;
t=(char*)malloc(n);
strcpy(t,s);
return t;
}
TreeNode * newStmtNode(StmtKind kind)
{
TreeNode * t=(TreeNode*)malloc(sizeof(TreeNode));
int i;
if(t==NULL)
cout<<"出错"<child[i]=NULL;
t->sibling=NULL;
t->nodekind=StmtK;
t->kind.stmt=kind;
t->lineno1=lineno;
}
return t;
}
TreeNode * newExpNode(ExpKind kind)
{
TreeNode * t=(TreeNode*)malloc(sizeof(TreeNode));
int i;
if(t==NULL)
cout<<"出错"<child[i]=NULL;
t->sibling=NULL;
t->nodekind=ExpK;
t->kind.exp=kind;
t->lineno1=lineno;
t->type=Void;