【正文】
eak。 case Void:fprintf(listing,Return Type %s Name: %s \n,[void],tree)。break。 default:break。 } break。 case ParamK: switch(treetype) { case Integer: fprintf(listing,Type: %s Name: %s \n,[int],tree)。break。 case Void:fprintf(listing,EMPTY\n)。break。 } break。 case VarDK: fprintf(listing,Var Declaration: )。 switch(treetype) { case Integer:fprintf(listing,Name: %s Type: %s \n,tree,[int])。break。 case IntArray:fprintf(listing,Name: %s Type: %s \n,tree,[int*])。break。 case Void:fprintf(listing,Type %s :\n,[void])。break。 } break。 case LocalDecK: fprintf(listing,Local Declarations:\n)。 break。 case StmtList: fprintf(listing,StatementList:\n)。 break。 case ComK: fprintf(listing,Compound:\n)。 break。 case CallK: fprintf(listing,Call Function:%s()\n,tree)。 break。 case ArgK: fprintf(listing,Args:\n)。 break。 case ParamList: fprintf(listing,ParamList:\n)。 break。 case ArgList: fprintf(listing,ArgList:\n)。 break。 default: fprintf(listing,Unknown ExpNode kind\n)。 break。 } } else if(treenodekind=ExpK) { switch(tree) { case OpK: fprintf(listing,Op: )。 printToken(tree,\0)。 break。 case ConstK: fprintf(listing,const: %d\n,tree)。 break。 case IdK: switch(treetype) { case ArrayUnit:fprintf(listing,Id: %s[]\n,tree)。break。 default:fprintf(listing,Id: %s\n,tree)。break。 } break。 default: fprintf(listing,Unknown ExpNode kind\n)。 break。 } } else { fprintf(listing,Unknown node kind\n)。 } for(i=0。iMAXCHILDREN。i++) { printTree(treechild[i])。 } tree=treesibling。 } UNINDENT。}ifndef _GLOBALS_H_define _GLOBALS_H_include include include include ifndef FALSEdefine FALSE 0endififndef TRUEdefine TRUE 1endif/* MAXRESERVED = the number of reserved words */define MAXRESERVED 6typedef enum/* bookkeeping tokens */{ ENDFILE,ERROR, /* reserved words */ ELSE,IF,INT,RETURN,VOID,WHILE, /* multicharacter tokens */ ID,NUM, /* special symbols */PLUS,MINUS,TIMES,OVER,LT,MT,EQ,NEQ,ASSIGN,SEMI,DOT,LPAREN,RPAREN,LZKH,RZKH,LDKH,RDKH,LZS,RZS,ME,LE} TokenType。extern FILE* source。extern FILE* listing。extern int lineno。/* source line number for listing */typedef enum {StmtK,ExpK} NodeKind。typedef enum {IfK,LocalDecK,RetK,ExpstmtK,AssignK,ElseK,WhileK,FunDK,VarDK,DecK,StmtList,ParamList,CallK,ArgList,ParamK,ComK,ArgK} StmtKind。typedef enum {OpK,ConstK,IdK} ExpKind。/* ExpType is used for type checking */typedef enum {Void,Integer,Boolean,IntArray,ArrayUnit} ExpType。define MAXCHILDREN 20typedef struct treeNode { struct treeNode * child[MAXCHILDREN]。 struct treeNode * sibling。 int lineno。 NodeKind nodekind。 union { StmtKind stmt。 ExpKind exp。} kind。 union { TokenType op。 int val。 char * name。 } attr。 ExpType type。 } TreeNode。extern int EchoSource。extern int TraceScan。extern int TraceParse。extern int Error。endififndef _PARSE_H_define _PARSE_H_TreeNode * parse (void)。endififndef _SCAN_H_define _SCAN_H_define MAXTOKENLEN 40extern char tokenString[MAXTOKENLEN+1]。TokenType getToken(void)。endififndef _UTIL_H_define _UTIL_H_/* Procedure printToken prints a token and its lexeme to the listing file*/void printToken( TokenType, const char* )。/* Function newStmtNode creates a new statement * node for syntax tree construction */TreeNode * newStmtNode(StmtKind)。/* Function newExpNode creates a new expression * node for syntax tree construction */TreeNode * newExpNode(ExpKind)。/* Function copyString allocates and makes a new * copy of an existing string */char * copyString( char * )。/* procedure printTree prints a syntax tree to the * listing file using indentation to indicate subtrees */void printTree( TreeNode * )。endif(1)測(cè)試數(shù)據(jù)選擇(2)測(cè)試結(jié)果分析(見下頁(yè)) 收獲:通過此次實(shí)驗(yàn),我了解了詞法和語(yǔ)法分析器的工作原理,加深了對(duì)詞法分析和語(yǔ)法分析的理解,掌握了詞法分析和語(yǔ)法分析的方法。按照文法規(guī)則對(duì)字符進(jìn)行分類,程序源碼簡(jiǎn)潔明了,基本符合實(shí)驗(yàn)要求。 不足:該程序考慮的還不夠全面,在運(yùn)行的時(shí)候可能出現(xiàn)一些未知的沒有考慮到的錯(cuò)誤。