freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

編譯原理課程設(shè)計--c-編譯器詞法分析與語法分析的實現(xiàn)-免費(fèi)閱讀

2025-02-10 01:33 上一頁面

下一頁面
  

【正文】 x = input()。 char * name。 NodeKind nodekind。本以為不用改的,typedef enum{StmtK,ExpK,DecK,ParamK} NodeKind。 tsibling = NULL。 } return t。 if (t==NULL) fprintf(listing,Out of memory error at line %d\n,lineno)。 tnodekind = ExpK。}TreeNode * newExpNode(ExpKind kind) {// TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode))。 default: fprintf(listing,Unknown params kind\n)。 } } else if (treenodekind == ParamK) { switch(tree) { case Var: fprintf(listing,Var %s\n,tree)。 break。 case IdK: fprintf(listing,Id: %s\n,tree)。 break。 break。 break。 break。 break。 break。 break。 case RPAREN_2: fprintf(listing,])。 } } } return t。// fprintf(listing,\nits arg_l time\n)。 } return t。 default: t = newExpNode(IdK)。 match(RPAREN_3)。 match(RPAREN_3)。 switch(token) { case NUM: t = newExpNode(ConstK)。 t = p。 tchild[1] = term()。}TreeNode * additive_expression(void) { TreeNode * t = term()。// fprintf(listing,\n+++++%s+++++\n,tokenString)。 match(ID)。 t = p。 } return t。 return t。}TreeNode * iteration_stmt(void) { TreeNode * t = newStmtNode(IterationK)。 match(IF)。 default: syntaxError(unexpected token in statement )。 t = selection_stmt()。// fprintf(listing,\n+++++%s+++++\n,tokenString)。// fprintf(listing,\nits exp_s time\n)。amp。 TreeNode * p。 if(token == INT) { t = declaration()。 (token == VOID || token == INT)) tchild[0] = local_declaration()。 } else t = Var。 break。 case INT: t = int。 } } } return t。 while ( (token != RPAREN_3) amp。 default: t = UNull。 break。 t = FunK。 match(RPAREN_2)。 token = getToken()。 match(INT)。vardeclarationamp。 | int a。amp。 TreeNode * q = NULL。 } } if (TraceScan) { fprintf(listing,\n%d: ,lineno)。 } // fprintf(listing,out switch)。 save = FALSE。 break。 else currentToken = ASSIGN。=39。//不是,返回注釋 break。 ungetNextChar()。//判斷 出 注釋 else state = INCOMMENT。 break。}39。]39。)39。*39。+39。,39。!39。39。) || (c == 39。/39。 int save。、詞法分析部分():其中部分代碼因為參照附錄B中內(nèi)容而未修改,所以略去。static TreeNode * var(void)。static TreeNode * local_declaration(void)。} reservedWords[MAXRESERVED] = {if,IF},{else,ELSE},{int,INT},{return,RETURN},{void,VOID},{while,WHILE}}。 。依靠下一步所得到的token,根據(jù)整理過后的語法規(guī)則來判斷語法樹的結(jié)點生成與走向。下面是我在代碼中所使用的自己整理出來的語法規(guī)則:注:{ }為重復(fù)[ ]為選擇,{}為本來的意思1. program → declarationlist 2. declarationlist → declaration { declaration }3. declaration → int|void|empty ID [factor]。、parse部分:、實驗原理:C語言的各個語法規(guī)則: 1. program → declarationlist 2. declarationlist → declarationlist declaration | declaration 3. declaration → vardeclaration | fundeclaration 4. vardeclaration → typespecifier ID 。注釋不能嵌套。在此程序中,我將記號分成了以下類型:typedef enum {//按照書上附錄B程序布局, ENDFILE,ERROR, IF,ELSE,INT,RETURN,VOID,WHILE, ID,NUM, ASSIGN,PLUS,MINUS,TIMES,OVER,LT,LET,BT,BET,EQ,NEQ, // = + * / = = == != LPAREN_1,RPAREN_1,SEMI,COM,LPAREN_2,RPAREN_2,LPAREN_3,RPAREN_3,LIN,RIN// { } 。 , [ ] ( ) /* } TokenType。、實驗方法:我通過對scanner部分原理的了解,確定了他的NFA,再將NFA轉(zhuǎn)化成DFA,并且將狀態(tài)數(shù)最小化。 | typespecifier ID [ NUM ] 。| (params)poundstmt4. params → paramslist | void 5. paramlist → param { param }6. param → int|void ID empty|[] 7. poundstmt → { localdeclarations statementlist } 8. localdeclarations → { declaration }|empty9. statementlist → { statement }|empty 10. statement → expressionstmt | poundstmt | selectionstmt | iterationstmt | returnstmt 11. expressionstmt → expression 。并且根據(jù)語法規(guī)則來確定語法樹的末結(jié)點的內(nèi)容。 。//根據(jù)書上原型做的,但根據(jù)語法規(guī)則所需要的,做過大量修改static TokenType reservedLookup (char * s) {}//根據(jù)書上原型做的,未經(jīng)修改TokenType getToken(void) {}//根據(jù)書上原型做的,但根據(jù)語法規(guī)則所需要的,做過大量修改static void syntaxError(char * message) {}//根據(jù)書上原型做的,未經(jīng)修改static void match(TokenType expected) {}//根據(jù)書上原型做的,未經(jīng)修改//以下的全部為自己所寫static TreeNode * program(void)。 static TreeNode * statement_list(void)。 static TreeNode * simple_expression(void)。typedef enum {//,定義11個中間狀態(tài),其中INASSIGN分成了L_ASSIGN,R_ASSIGN,而在分析注釋結(jié)束時添加了INASSIGN_2狀態(tài) E_ASSIGN,N_ASSIGN, START,INASSIGN_1,L_ASSIGN,R_ASSIGN, E_ASSIGN,N_ASSIGN,INASSIGN_2,INCOMMENT, INNUM,INID,DONE} StateType。 while (state !=DONE) { int c = getNextChar()。) { save = FALSE。\n39。) { save = FALSE。) { save = FALSE。: currentToken = COM。: currentToken = PLUS。: currentToken = TIMES。: currentToken = RPAREN_3。: currentToken = RPAREN_2。: currentToken = RPAREN_1。 } } break。 break。//char停住,否則會令“/”號后面的char讀不出來 currentToken = OVER。 case L_ASSIGN: if(c == 39。) currentToken = BET。 state = DONE。 case INNUM: if (!isdigit(c)) { ungetNextChar()。 state = DONE。 // getchar()。 printToken(currentToken,tokenString)。// fprintf(listing,\nits dec_li time\n)。(token==INT||token==VOID)) { q = declaration()。 | void a?。amp。 break。 break。 match(SEMI)。 if(t!=NULL) tchild[0] = params()。 }return t。 t child[0] = param_list()。amp。}TreeNode * param(void) { TreeNode * t = newParamNode()。 t = UNull。 } if((t != NULL)amp。 return t。 if( t != NULL) tchild[1] = statement_list()。 q = t。// fprintf(listing,\nits sta_l time\n)。(token!=RPAREN_1)) { TreeNode * q。// fprintf(listing,\n+++++%s+++++\n,tokenString)。 switch(token) { case ID: case NUM: case LPAREN_3: case SEMI:// fprintf(listing,\nits expression_stmt() time\n)。 break。 printToken(token,tokenString)。 match(LPAREN_3)。// fprintf(listing,\nits iter time\n)。}TreeNode * return_stmt(void) { TreeNode * t = newStmtNode(ReturnK)。}TreeNode * expressi
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1