logo资料库

四川大学 编译原理 Tiny语法分析器 纯代码.docx

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
#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;
分享到:
收藏