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

正文內(nèi)容

c語(yǔ)言詞法分析器和c-語(yǔ)言語(yǔ)法分析器編譯原理課程設(shè)計(jì)(完整版)

  

【正文】 ,向前探測(cè) 1個(gè) token的值確定是函數(shù)聲明還是變量聲明,如果 token為 ’ [’ ,則是數(shù)組變量聲明, 返回節(jié)點(diǎn) Array_DeclK, token為 ’ ( ’ ,則是函數(shù)聲明, 返回節(jié)點(diǎn) FunK, token 為 ’ 。 q = declaration()。 //程序以變量聲明開(kāi)始 while((token!=INT)amp。 4 代碼結(jié)構(gòu)分析 文法 program→declarationlist 分析函數(shù) TreeNode * parse(void) 說(shuō)明 C程序由一個(gè)聲明序列組成, parse( void)函數(shù)首先執(zhí)行 getToken()然后 直接調(diào)用declaration_list()返回樹(shù)節(jié)點(diǎn) 代碼 TreeNode * parse(void) { TreeNode * t。 int lineno。 另外 C語(yǔ)言詞法比較復(fù)雜,因?yàn)闀r(shí)間關(guān)系我省略了一些,比如位運(yùn)算符,轉(zhuǎn)義字符等等,希望今后能完善。 char d = 39。 /* token字符串 */ int lineno = 0。 詞法分析的 DFA設(shè)計(jì) 詞法分析的 DFA 如下所示,一共分為 10個(gè)狀態(tài): START、 INNUM、 INNUM INNUMINID、 INCOMPARE、 INOPERATE、 INSTRING、 INCHAR、 DONE。 《 編譯原理課程設(shè)計(jì) 》課程 報(bào)告 題目 C 語(yǔ)言 詞法分析器 和 C語(yǔ)言語(yǔ)法分析器 學(xué)生姓名 學(xué)生學(xué)號(hào) 指導(dǎo)教師 提交報(bào)告時(shí)間 2021 年 6 月 8 日 四川大學(xué)《編譯原理課程設(shè)計(jì)》 學(xué)號(hào) 2021141461017 1 C 語(yǔ)言詞法 分析器 1 實(shí)驗(yàn)?zāi)康募?意義 1. 熟悉 C語(yǔ)言 詞法 2. 掌握 構(gòu)造 DFA 的過(guò)程 3. 掌握利用 DFA 實(shí)現(xiàn) C語(yǔ)言的詞法分析器 4. 理解編譯器詞法分析的工作原理 2 詞法特點(diǎn)及正則表達(dá)式 保留字 AUTO, BREAK , CASE , CHAR , CONST , CONTINUE , DEFAULT , DO , DOUBLE , ELSE, ENUM , EXTERN , FLOAT , FOR , GOTO, IF , INT , LONG , REGISTER , RETURN, SHORT , SIGNED , SIZEOF , STATIC , STRUCT , SWITCH , TYPEDEF , UNION , UNSIGNED , VOID, VOLATILE , WHILE, 符號(hào) + * / ++ += = *= = = == != = 。狀態(tài) START 表示開(kāi)始狀態(tài),狀態(tài) INNUM, INNUM1, INNUM2 表示數(shù)字類(lèi)型( NUM) Token 的狀態(tài),狀態(tài) INID表示標(biāo)示符 ( ID) 類(lèi)型 Token 的狀態(tài) ,狀態(tài) INOPERATE表示 算數(shù) 運(yùn)算符型 Token 的狀態(tài) ,狀態(tài) INOCOMPARE表示 比較 運(yùn)算符型 Token 的狀態(tài) , INSTRING表示字符串( STRING)類(lèi)型 Token 的狀態(tài), INCHAR 表示字符( CHARACTER)類(lèi)型 Token 的狀態(tài), 狀態(tài) DONE 表示接收狀態(tài)。 /* 當(dāng)前行號(hào) */ static char lineBuf[BUFLEN]。h39。 四川大學(xué)《編譯原理課程設(shè)計(jì)》 學(xué)號(hào) 2021141461017 8 C語(yǔ)言語(yǔ)法 分析器 1 實(shí)驗(yàn)?zāi)康募耙饬x 用 C語(yǔ)言編制 Tiny/C語(yǔ)言的語(yǔ)法分析程序,實(shí)現(xiàn)對(duì)詞法分析程序所提供的 Token序列的語(yǔ)法檢查和結(jié)構(gòu)分析。 NodeKind nodekind。 token = getToken()。amp。 if (q!=NULL) { if (t==NULL) { t=p=q?!?則是 普通變量聲明,返回節(jié)點(diǎn)四川大學(xué)《編譯原理課程設(shè)計(jì)》 學(xué)號(hào) 2021141461017 12 Var_DeclK 代碼 TreeNode * declaration(void) { TreeNode * t = NULL。 match(VOID)。 tchild[0] = p。 tchild[0] = p。 match(RBRACKET)。 } return t。 } else { syntaxError()。 q = param(k)。 if(k==NULLamp。 } 四川大學(xué)《編譯原理課程設(shè)計(jì)》 學(xué)號(hào) 2021141461017 16 else if (k!=NULL) { p = k。amp。 match(LCBRACKET)。 while(token==INT || token==VOID) { p = newNode(Var_DeclK)。amp。 match(RBRACKET)。 } } } return t。 } } } return t。 case RETURN: t = return_stmt()。 break。 match(SEMI)。 pchild[0] = t。 if(token==ID) { p = newNode(IdK)。 tchild[1] = q。 t = q。 int i。 一開(kāi)始我對(duì) TreeNode 數(shù)據(jù)結(jié)構(gòu) 也 不是很理解,通過(guò)閱讀書(shū)后的 tiny 語(yǔ)言語(yǔ)法分析源代碼,我弄懂了語(yǔ)法樹(shù)的輸出 。 scanf(%s,pgm)。 /* listing在屏幕上輸出 */ fprintf(listing,\nC COMPILATION: %s\n,pgm)。 /* holds current token */ TreeNode * parse(void)。 TreeNode * statement_list(void)。 TreeNode * simple_expression(TreeNode * k)。 四川大學(xué)《編譯原理課程設(shè)計(jì)》 學(xué)號(hào) 2021141461017 28 Error = TRUE。 if(token!=ENDFILE) { syntaxError(endfile_error)。(token!=ENDFILE)) { syntaxError(開(kāi)始不是類(lèi)型聲明 )。 } } } match(ENDFILE)。 match(INT)。 match(ID)。 } else if (token==LBRACKET) { t = newNode(Var_DeclK)。 achild[0]=q。 } else { syntaxError()。 } else//參數(shù)列表為 (void id,[……]) { tchild[0] = param_list(p)。 match(COMMA)。 TreeNode * q = NULL。 match(INT)。 } if (token==LBRACKETamp。 } 四川大學(xué)《編譯原理課程設(shè)計(jì)》 學(xué)號(hào) 2021141461017 34 TreeNode * pound_stmt(void) { TreeNode * t = newNode(CompK)。 TreeNode * p = NULL。 } if((p!=NULL)amp。 match(LBRACKET)。 q = p。 } TreeNode * statement_list(void) { TreeNode * t = statement()。 match(SEMI)。(token==ID)) { TreeNode * q2 = newNode(IdK)。 if(token==INT) { TreeNode * q1 = newNode(IntK)。 tchild[0] = local_declaration()。(tchild[1]!=NULL))// { match(LBRACKET)。 } if(p!=NULL) { tchild[0] = p。amp。 if (q!=NULL) { if (t==NULL) { t=p=q。 } else { syntaxError()。 } return t。 match(RBRACKET)。 tchild[0] = p。 tchild[0] = p。 match(VOID)。 } TreeNode * declaration(void) { TreeNode * t = NULL。 if(token==ENDFILE) break。 } TreeNode * declaration_list(void) { TreeNode * t = declaration()。 else { syntaxError(unexpected token )。 TreeNode * term(TreeNode * k)。 TreeNode * expression_stmt(void)。 TreeNode * declaration(void)。 // } syntaxTree = parse()。.39。 /* 編譯過(guò)程標(biāo)志 */ int EchoSource = TRUE。 while(ilow) { a[0]=1。 tchild[1] = additive_expression(k)。 } } return t。 match(ID)。 return p。 } 文法 expression→ var = expression | simpleexpression 分析函數(shù) TreeNode * expression(void) 說(shuō)明 expression(void)函數(shù)通過(guò)判斷先行 Token 類(lèi)型是否為 ID,如果不是說(shuō)明只能是simple_expression情況,則調(diào)用 simple_expression(TreeNode * k)函數(shù)遞歸向下分析;如果是 ID說(shuō)明可能是賦值語(yǔ)句,或 simple_expression中的 var和 call類(lèi)型的情況,所以再求其 Follow 集合,如果集合求出來(lái)是賦值類(lèi)型的 Token,則說(shuō)明是賦值語(yǔ)句,于是新建一個(gè)AssignK節(jié)點(diǎn)就行;如果集合求出來(lái)不是賦值類(lèi)型的 Token則說(shuō)明是 simple_expression中的var和 call類(lèi)型的情況,然后再調(diào)用 simple_expression(TreeNode * k)函數(shù)遞歸向下分析,并將已經(jīng)取出 IdK節(jié)點(diǎn)傳遞給 simple_expression(TreeNode * k)函數(shù) 代碼
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1