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

正文內(nèi)容

c語言詞法分析器和c-語言語法分析器編譯原理課程設(shè)計(參考版)

2025-03-07 16:34本頁面
  

【正文】 while (IF==token || LCBRACKET==token || ID==token || WHILE==token || RETURN ==token || SEMI==token || LPAREN==token || NUM==token)
。 } TreeNode * statement_list(void) { TreeNode * t = statement()。 q = p。 } if(p!=NULL) { if(t==NULL) t = q = p。 } else { match(SEMI)。 match(SEMI)。 match(LBRACKET)。 if(token==LBRACKET) 四川大學(xué)《編譯原理課程設(shè)計》 學(xué)號 2021141461017 35 { TreeNode * q3 = newNode(Var_DeclK)。 pchild[1] = q2。(token==ID)) { TreeNode * q2 = newNode(IdK)。 } if((p!=NULL)amp。 pchild[0] = q1。 match(INT)。 if(token==INT) { TreeNode * q1 = newNode(IntK)。 TreeNode * p = NULL。 } TreeNode * local_declaration(void) { TreeNode * t = NULL。 match(RCBRACKET)。 tchild[0] = local_declaration()。 } 四川大學(xué)《編譯原理課程設(shè)計》 學(xué)號 2021141461017 34 TreeNode * pound_stmt(void) { TreeNode * t = newNode(CompK)。 } } else { syntaxError()。 match(RBRACKET)。(tchild[1]!=NULL))// { match(LBRACKET)。 } if (token==LBRACKETamp。 match(ID)。 q = copyString(tokenString)。 } if(p!=NULL) { tchild[0] = p。 match(INT)。amp。 match(VOID)。amp。 TreeNode * q = NULL。 } TreeNode * param(TreeNode * k) { TreeNode * t = newNode(ParamK)。 p = q。 if (q!=NULL) { if (t==NULL) { t=p=q。 match(COMMA)。 k = NULL。 } TreeNode * param_list(TreeNode * k) { TreeNode * t = param(k)。 } else { syntaxError()。 } else//參數(shù)列表為 (void id,[……]) { tchild[0] = param_list(p)。 match(VOID)。 TreeNode * p = NULL。 } return t。 } else { syntaxError()。 tchild[1] = q。 } else if (token==SEMI) { t = newNode(Var_DeclK)。 match(RBRACKET)。 achild[0]=q。 s = atoi(tokenString)。 match(LBRACKET)。 tchild[0] = p。 } else if (token==LBRACKET) { t = newNode(Var_DeclK)。 match(RPAREN)。 match(LPAREN)。 tchild[0] = p。 match(ID)。token==ID) { q = newNode(IdK)。 } if(p!=NULLamp。 match(VOID)。 match(INT)。 TreeNode * a = NULL。 TreeNode * q = NULL。 } TreeNode * declaration(void) { TreeNode * t = NULL。 } } } match(ENDFILE)。 } else { psibling=q。 q = declaration()。 if(token==ENDFILE) break。(token!=ENDFILE)) { syntaxError(開始不是類型聲明 )。(token!=VOID)amp。 //程序以變量聲明開始 while((token!=INT)amp。 } TreeNode * declaration_list(void) { TreeNode * t = declaration()。 if(token!=ENDFILE) { syntaxError(endfile_error)。 token = getToken()。 fprintf(listing, )。 else { syntaxError(unexpected token )。 四川大學(xué)《編譯原理課程設(shè)計》 學(xué)號 2021141461017 28 Error = TRUE。 static void syntaxError(char * message) { fprintf(listing,\n )。 TreeNode * call(TreeNode * k)。 TreeNode * term(TreeNode * k)。 TreeNode * simple_expression(TreeNode * k)。 TreeNode * expression(void)。 TreeNode * iteration_stmt(void)。 TreeNode * expression_stmt(void)。 TreeNode * statement_list(void)。 TreeNode * pound_stmt(void)。 TreeNode * param_list(TreeNode * k)。 TreeNode * declaration(void)。 /* holds current token */ TreeNode * parse(void)。 } 四川大學(xué)《編譯原理課程設(shè)計》 學(xué)號 2021141461017 27 ifndef _PARSE_H_ define _PARSE_H_ TreeNode * parse(void)。 fclose(source)。 // } syntaxTree = parse()。 /* listing在屏幕上輸出 */ fprintf(listing,\nC COMPILATION: %s\n,pgm)。 exit(1)。 } source = fopen(pgm,r)。.39。 scanf(%s,pgm)。 char pgm[120]。 int Error = FALSE。 /* 編譯過程標(biāo)志 */ int EchoSource = TRUE。 一開始我對 TreeNode 數(shù)據(jù)結(jié)構(gòu) 也 不是很理解,通過閱讀書后的 tiny 語言語法分析源代碼,我弄懂了語法樹的輸出 。 語法分析程序編寫相對于詞法分析要困難得多,首先要將 BNF 化為 EBNF,運用遞歸向下的方法進(jìn)行編寫 , 構(gòu)造出語法樹, 判別語法分析過程中是否出錯以及出錯位置和錯誤類型。 } } return x。 while(ilow) { a[0]=1。 int i。 int min(int a[],int low,void a) { int k。 } return t。 tchild[1] = additive_expression(k)。 t = q。 q = token。 k = NULL。 } } return t。 tchild[1] = q。 t = newNode(Arry_ElemK)。 q = expression()。 match(ID)。 if(token==ID) { p = newNode(IdK)。 TreeNode * p = NULL。 } } return t。 return p。 pchild[0] = t。 //p = 。 } else//以 ID開頭,可能是賦值語句,或 simple_expression中的 var和 call類型的情況 { TreeNode * p = NULL。 } 文法 expression→ var = expression | simpleexpression 分析函數(shù) TreeNode * expression(void) 說明 expression(void)函數(shù)通過判斷先行 Token 類型是否為 ID,如果不是說明只能是simple_expression情況,則調(diào)用 simple_expression(TreeNode * k)函數(shù)遞歸向下分析;如果是 ID說明可能是賦值語句,或 simple_expression中的 var和 call類型的情況,所以再求其 Follow 集合,如果集合求出來是賦值類型的 Token,則說明是賦值語句,于是新建一個AssignK節(jié)點就行;如果集合求出來不是賦值類型的 Token則說明是 simple_expression中的var和 call類型的情況,然后再調(diào)用 simple_expression(TreeNode * k)函數(shù)遞歸向下分析,并將已經(jīng)取出 IdK節(jié)點傳遞給 simple_expression(TreeNode * k)函數(shù) 代碼 TreeNode * expression(void) { TreeNode * t = var()。 match(SEMI)。 return t。 expression_stmt(void)函數(shù)通過判斷先行 token類型是否為分號,如果不是則直接調(diào)用函數(shù) expression() 代碼 TreeNode * expression_stmt(void) { TreeNode * t = NULL。 } 文法 expressionstmt→ [expression]。 break。 default: syntaxError()。 case ID: case SEMI: case LPAREN: case NUM: t = expression_stmt()。 case LCBRACKET: t = pound_stmt()。 case RETURN: t = return_stmt()。 case WHILE: t = iteration_stmt()。 switch(token) { case IF: t = selection_stmt()。statement(void)函數(shù)通過判斷先行 Token 類型確定到底是哪一種類型。 } } } return t。 } else { psib
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1