![編譯原理課程設(shè)計(jì)-C-詞法掃描器及語(yǔ)法分析器實(shí)現(xiàn)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/36701447-8eb9-4477-bcf6-83b710e2a929/36701447-8eb9-4477-bcf6-83b710e2a9291.gif)
![編譯原理課程設(shè)計(jì)-C-詞法掃描器及語(yǔ)法分析器實(shí)現(xiàn)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/36701447-8eb9-4477-bcf6-83b710e2a929/36701447-8eb9-4477-bcf6-83b710e2a9292.gif)
![編譯原理課程設(shè)計(jì)-C-詞法掃描器及語(yǔ)法分析器實(shí)現(xiàn)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/36701447-8eb9-4477-bcf6-83b710e2a929/36701447-8eb9-4477-bcf6-83b710e2a9293.gif)
![編譯原理課程設(shè)計(jì)-C-詞法掃描器及語(yǔ)法分析器實(shí)現(xiàn)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/36701447-8eb9-4477-bcf6-83b710e2a929/36701447-8eb9-4477-bcf6-83b710e2a9294.gif)
![編譯原理課程設(shè)計(jì)-C-詞法掃描器及語(yǔ)法分析器實(shí)現(xiàn)_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/36701447-8eb9-4477-bcf6-83b710e2a929/36701447-8eb9-4477-bcf6-83b710e2a9295.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編譯原理課程設(shè)計(jì)報(bào)告課題名稱: C- 詞法掃描器及語(yǔ)法分析器實(shí)現(xiàn)提交文檔學(xué)生姓名:提交文檔學(xué)生學(xué)號(hào):同組成員名單:無(wú)指導(dǎo)教師姓名:金軍指導(dǎo)教師評(píng)閱成績(jī):指導(dǎo)教師評(píng)閱意見:提交報(bào)告時(shí)間:2014年6月xx日編譯原理課程設(shè)計(jì)報(bào)告xx xxxxxxxxx目錄目錄21課程設(shè)計(jì)目標(biāo)32分析與設(shè)計(jì)42.1程序結(jié)構(gòu)43程序代碼實(shí)現(xiàn)83.1代碼結(jié)構(gòu)8指導(dǎo)老師:金軍3.2.1 globals.h 83.2.2 scan.c103.2.3 parser.c.73.2.4 util.c293.5 test.cpp4測(cè)試結(jié)果3637.1.1 給出標(biāo)準(zhǔn)測(cè)試程序的詞法和語(yǔ)法分析結(jié)果: 詞法分析結(jié)果.371
2、.1.2 語(yǔ)法分析結(jié)果401.2 .修改代碼后的結(jié)果:.411.2.1 修改415 .本課程設(shè)計(jì)我的獨(dú)創(chuàng)工作 436 .總結(jié).431課程設(shè)計(jì)目標(biāo)學(xué)生在學(xué)習(xí)編譯原理課程過(guò)程中,結(jié)合各章節(jié)的構(gòu)造編譯程序的基本理論,要求用 C或 C+語(yǔ)言描述及上機(jī)調(diào)試,實(shí)現(xiàn)一個(gè)C-Minus小編譯程序(包括詞法分析,語(yǔ)法分析等重要子程 序),使學(xué)生將理論與實(shí)際應(yīng)用結(jié)合起來(lái),受到軟件設(shè)計(jì)等開發(fā)過(guò)程的全面訓(xùn)練,從而提高學(xué)生軟 件開發(fā)的能力。要求:(1)設(shè)計(jì)詞法分析器設(shè)計(jì)各單詞的狀態(tài)轉(zhuǎn)換圖,并為不同的單詞設(shè)計(jì)種別碼。將詞法分析器設(shè)計(jì)成供語(yǔ)法分析器調(diào) 用的子程序。功能包括:a.具備預(yù)處理功能。將不翻譯的注釋等符號(hào)先濾掉,只
3、保留要翻譯的符號(hào)串,即要求設(shè)計(jì) 一個(gè)供詞法分析調(diào)用的預(yù)處理子程序;b.能夠拼出語(yǔ)言中的各個(gè)單詞;c.返回(種別碼,屬性值)。(2)語(yǔ)法分析要求用學(xué)習(xí)過(guò)的自底向上或自頂向下的分析方法等,實(shí)現(xiàn)對(duì)表達(dá)式、各種說(shuō)明語(yǔ)句、控制語(yǔ)句 進(jìn)行語(yǔ)法分析。若語(yǔ)法正確,則用語(yǔ)法制導(dǎo)翻譯法進(jìn)行語(yǔ)義翻譯;生成并打印出語(yǔ)法樹;若語(yǔ) 法錯(cuò)誤,要求指出出錯(cuò)性質(zhì)和出錯(cuò)位置(行號(hào))。2分析與設(shè)計(jì)2.1程序結(jié)構(gòu)本程序采用C+語(yǔ)言以面向?qū)ο蟮乃枷刖帉?,程序分為兩部分:詞法分析(Scanner )和語(yǔ)法分 析(Parser )。掃描程序執(zhí)行詞法分析,并將字符序列收集到token中,并將每一行的Token打印出來(lái)。實(shí)現(xiàn)方法:Scanne
4、r:手工實(shí)現(xiàn)Parser:遞歸下降系統(tǒng)總圖:程序流程:在程序中,詞法分析獲取所有Token ,并將獲取的 Token存儲(chǔ)在scanner 對(duì)象的tokenString 中。然后Parser類的語(yǔ)法分析程序就根據(jù)tokenString 中的Token進(jìn)行語(yǔ)法 分析,生成語(yǔ)法樹,最后打印語(yǔ)法樹。同時(shí),這也是程序的流程。整體程序流程圖掃描器:C慣用的詞法1、語(yǔ)言的關(guān)鍵字:else if int return void while2、專用符號(hào):+ - * / < <= > >= = != = ; , ( ) /* */3、其他標(biāo)記是ID和NUM通過(guò)下列正則表達(dá)式定義:ID =
5、letter letter*NUM = digit digit*letter = a|.|z|A|.|Zdigit = 0|.|94、空格由空白、換行符和制表符組成??崭裢ǔ1缓雎?,除了它必須分開ID、NU或鍵字。5.注釋用通常的C語(yǔ)言符號(hào)/* . * /圍起來(lái)。注釋可以放在任何空白出現(xiàn)的位置(即注釋不能放在標(biāo)記內(nèi))上,且可以超過(guò)一行。注釋不能嵌套。DF照如下:初始狀態(tài)設(shè)置為START當(dāng)需要得到下一個(gè)token時(shí),取得此token的第一個(gè)字符,并且按照DFAW對(duì) 此字符的類型的分析,轉(zhuǎn)換狀態(tài)。重復(fù)此步驟,直到 DON的止,輸出token類型。參考課本中所給的TINY掃描程序的DFA C-的DF
6、A同之處在于注釋以及(=,!=,< =, > =)的處理:1.注釋部分參考了課本中C風(fēng)格注釋的DFA2.處理(=,!=,< =, > =)時(shí)并沒(méi)有新建狀態(tài),而是在狀態(tài)INASSIGN分了 4種情況,通過(guò)一個(gè)變量分別處理。語(yǔ)法分析:C-語(yǔ)法與語(yǔ)義:1. program f declaration-list2. declaration-list f declaration-list declaration | declaration3. declaration f var-declaration | fun-declaration4. var-declaration f t
7、ype-specifier ID ; | type-specifier ID NUM ;5. type-specifier f int | void6. fun-declaration f type-specifier ID ( params ) compound-stmt(在課后解釋中 compound-stmt前面沒(méi)有“ | "符號(hào))7. params f params-list | void8. param-list f param-list , param | param9. param f type-specifier ID | type-specifier ID 10.
8、compound-stmt - local-declarations statement-list 11. local-declarations f local-declarations var-declaration | empty12. statement-list 一 statement-list statement | empty13. statement f expression-stmt | compound-stmt | selection-stmt |iteration-stmt | return-stmt14. expression-stmt f expression ; |
9、 ;15. selection-stmt f if ( expression ) statement | if ( expression )statement else statement16. iteration-stmt f while(expression) statement17. return-stmt 一 return ; | return expression ;18. expression f var = expression | simple-expression19. var 一 ID | ID expression 20. simple-expression f addi
10、tive-expression relop additive-expression |additive-expression21. relop <= | < | > | >= | = | !=22. additive-expression f additive-expression addop term | term23. addop 一 +|-24. term 一 term mulop factor | factor25. mulop 一 * | /26. factor f ( expression ) | var | call | NUM27. call 一 ID
11、( args )28. args f arg-list | empty29. arg-list - arg-list , expression | expression 代碼設(shè)計(jì)格式:程序結(jié)構(gòu):語(yǔ)法分析函數(shù)parser通過(guò)調(diào)用詞法分析函數(shù)getToken實(shí)現(xiàn)語(yǔ)法分析。文件和函數(shù)的設(shè)計(jì)說(shuō)明:文件main.c包含相應(yīng)頭文件,及main函數(shù)的實(shí)現(xiàn);文件golbals.h包含符號(hào)表和 分析數(shù)的數(shù)據(jù)結(jié)構(gòu)及在其它文件中使用的變量;文件util.h 和util.c 實(shí)現(xiàn)與詞法分析和語(yǔ)法分析輸出相關(guān) 的函數(shù)printToken 和printTree ,以及分析樹節(jié)點(diǎn)初始化相關(guān)的函數(shù) newStmtNode n
12、ewExpNode(Expkind) 和copyString ;文件scan.h和scan.c實(shí)現(xiàn)詞法分析,主要函數(shù)為getToken;文件parser.h 和parser.c 實(shí)現(xiàn)語(yǔ)法分析,函數(shù)為與文法規(guī)則對(duì)應(yīng)的函數(shù)。3程序代碼實(shí)現(xiàn)3.1代碼結(jié)構(gòu)3.2.1 globals.h#ifndef _GLOBALS_H_#define _GLOBALS_H#include <STDIO.H>#include <STDLIB.H>#include <CTYPE.H>#include <STRING.H>#include <iostream>#
13、include <direct.h> using namespacstd;#ifndef FALSE#define FALSE)#endif#ifndef TRUE#define TRU日;#endif/保留字的個(gè)數(shù)#define MAXRESEREED typedef enum /book-keeping tokensENDFILEERRO R/reserved wordsIF, ELSEINT, RETURVOIDWHILE/multicharacter tokensID, NUM/special symbols/LBRACKET/RBRACKET - LBRACE/RBRAC
14、E ASSIGNEQLT, RT PLUSMINUSTIMESOVERPARERPARESEMI ,LBRACKERBRACKETEQCOMMLBRAC田BRACE,LTEQRTEQ TokenType extern FILE* source; / 源代碼文件extern FILE* listing;/listing output text fileextern FILE* code;/ extern int lineno;/語(yǔ)法分析樹typedef enumNodeKind StmtK, ExpK DeclarationK , ;typedef enumStmtKind IfK, While
15、K AssignK, ReturnK, VoidK, ;typedef enumExpKind OpK ConstK IdK, Array_expK Function_expK, ;一一typedef enumExpType Void, Integer;typedef enumDeclarationKindFunctionK, VarK ArrayK, ParaMeterK ;#define MAXCHILDRENtypedef struct treeNodestruct treeNode "declaration;struct treeNode *child MAXCHILDREN
16、 struct treeNode "sibling;struct treeNode *params; int lineno;NodeKindnodekind; union kind StmtKind stmt;ExpKind exp;DeclarationKind declaration;kind; I struct MyStruct TokenTypeop;int val;char *name;int size;attr;ExpTypetype; TreeNodeextern int EchoSource;extern int TraceScan;extern int TraceP
17、arse;extern int TraceAnalyze;extern int TraceCode;extern int Error;#endif3.2.2 scan.c最主要的過(guò)程是GetToken,它消耗輸入字符并根據(jù)DFA返回下一個(gè)被識(shí)別的記號(hào)。這個(gè)實(shí)現(xiàn)利用 了雙重嵌套情況分析,以及一個(gè)有關(guān)狀態(tài)的大型情況列表,在大列表中是基于當(dāng)前輸入字符的單獨(dú)列表。 記號(hào)本身被定義成globals.h中的枚舉類型。掃描程序的狀態(tài)也被定義為一個(gè)枚舉類型,位于掃描程序 之中。掃描程序使用了三個(gè)全局變量,文件變量source, listing.在globals.h中聲明且在main.c中被 分配和初始化的整型
18、變量lineno。由getToken過(guò)程完成的額外的簿記如下所述:表reserved和過(guò)程reservedlookup完成位于由getToken 的主要循環(huán)識(shí)別的標(biāo)識(shí)符之后的保留字的查找,currentToken的值也隨之改變。標(biāo)志變量save被用作 指示是否將第一個(gè)字符增加到tokenString之上;由于需要包括空白格和非消耗的先行,因此這些東西 都是必要的。到掃描程序的字符輸入由getNextChar函數(shù)提供,該函數(shù)將一個(gè)256字符緩沖區(qū)內(nèi)部的lineBuf中 的字符取到掃描程序中,如果已經(jīng)耗盡了這個(gè)緩沖區(qū),且假設(shè)每一次都獲取了一個(gè)新的源代碼行,那么 getNextChar就利用fget
19、從source文件更新該緩沖區(qū)。最后由于從INUMF口 INID到最終狀態(tài)的轉(zhuǎn)換是非消耗的。可以通過(guò)一個(gè)ungetnextChar的過(guò)程在輸入緩 沖區(qū)的反填一個(gè)字符來(lái)完成這一任務(wù)。#include "globals.h"#include "util.h"#include "scan.h"typedefenum START, INASSIGN , INCOMMENT,INENDCOMMENT,INNUM, INID, DONE,INLT,INRT ,INNEQStateType;char tokenStringMAXTOKENLEN +
20、1;#defineBUFLEN 1024 static char lineBufBUFLEN ;static int linepos=0;static int bufsize=0;/getNextChar從lineBu徵得下一個(gè)非空字符,讀入新的一行如果lineBuf耗盡 static char getNextCHar(void)if (!(linepos<bufsize)lineno+;if (fgets(lineBuf,BUFLEN-1,source) if (EchoSource) fprintf(listing"%4d,%s",lineno,lineBuf);
21、 bufsize=strlen(lineBuf);linepos=0;return lineBuflinepos+; else return EOF;else return lineBuflinepos+;/ backtracks one character in lineBuf static void ungetNextChar(void)linepos-;查找表的保留字static structchar *str;TokenType tok;reservedWordsMAXRESERVED ='if",IF,"int",INT,"else&q
22、uot;,ELSE,'return", RETURN, "void",VOID,"while",WHILE;查找一個(gè)標(biāo)識(shí)符,看看這是否是一個(gè)保留字使用線性搜索static TokenType reservedLookup(char *s)inti;for(i=0;i<MAXRESERVED;+i)if(!strcmp(s,reservedWordsi.str)return reservedWordsi.tok;Ireturn ID;TokenType getToken(void)/索引存儲(chǔ)為"tokenString”in
23、t tokenStringIndex = 0;/i回回當(dāng)前tokenTokenType currentToken;當(dāng)前狀態(tài)總是以START開始StateType state = START;厝旨示存放至tokenString的標(biāo)志int save=TRUE;while (state != DONE)Zint c = getNextCHar();save = TRUE;switch (state)case START:if (isdigit(c)state = INNUM;else if (isalpha(c) state =INID;|else if (c ='=')state
24、 =INASSIGN;|else if (c = ' ') |(c ='t) | (c ='n')save = FALSE;else if (c = '/) 遇到"/"則假定就是注釋,進(jìn)入注釋狀態(tài) state = INCOMMENT;save = FALSE;else if (c ='>')state = INRT;else if (c ='<')state = INLT;else if (c = '!) state = INNEQ;elsestate = DONE;swit
25、ch (c)I3 _default currentToken = ERROR break;case EOF:save = FALSE;currentToken = ENDFILE; break;case ': currentToken = LBRACKET; break;case ': currentToken = RBRACKET; break;case ',: currentToken = COMMA break;case '+: currentToken = PLUS; break;case '-:IcurrentToken = MINUS;bre
26、ak;case '*:currentTOken = TIMES;break;case ':currentTOken = LBRACE;break;case':currentTOken = RBRACE;break;case '(:currentTOken = LPAREN;break;case'):currentTOken = RPAREN; break;case':currentTOken = SEMI;break;break;/*=注釋改動(dòng)=*/case INENDCOMMENT:if (c = '*'&&ge
27、tNextCHar() = '/') /token 是咀下一個(gè) token 是/則結(jié)束注釋 save = FALSE;state = START; /注釋不作處理,直到注釋結(jié)束,elsesave = FALSE;state = INENDCOMMENT;break;case INCOMMENT:if (c = '*') "/”后是*則進(jìn)入注釋/ungetNextChar();save = FALSE;state = INENDCOMMENT; 若是注釋開頭,轉(zhuǎn)入注釋結(jié)尾處理else if (c = EOF)state = DONE;currentTOk
28、en = ENDFILE;else / “/”后不是*則為除法 ungetNextChar();save = FALSE;currentToken = OVER state = DONE;3break;/*=賦值改動(dòng)=*/case INASSIGN:state = DONE;if (c = '=')/仆一個(gè)仍是等號(hào)就為相等currentToken = EQ;else /否則回退,胃ungetNextChar();save = FALSE;currentToken = ASSIGN;break;/*=小于等于=*/case INLT:state = DONE;if (c =
29、9;=')currentToken = LTEQ;elseungetNextChar();save = FALSE;currentToken = LTJbreak;/*=大于等于=*/case INRT:state = DONE;if (c ='=') currentToken = RTEQ;else(ungetNextChar();save = FALSE;currentToken = RT;)break;/*=不等于=*/case INNEQ:state = DONE;if (c ='=')currentToken = NEQ;elseungetNe
30、xtChar();save = FALSE;currentTOken = ERROR;3break;case INNUM:if (! isdigit(c)ungetNextChar();save = FALSE;state = DONE;currentTOken = NUMbreak;case INID:if (!isalpha(c)ungetNextChar();save = FALSE;state = DONE;currentTOken = ID;break;case DONE:defaultfprintf(listing,"Scanner Bug:state=%dn"
31、, state);state = DONE;currentTOken = ERROR;break;if (save) && (tokenStringIndex <=MAXTOKENLEN )tokenStringtokenStringIndex+ = char)c;if (state = DONE)tokenStringtokenStringIndex = '0'if (currentTOken = ID)currentToken = reservedLookup(tokenString);if (TraceScan)fprintf(listing,&qu
32、ot;t%d:", lineno);printTOken(currentTOken, tokenString);return currentTOken;3.2.3 parsec#include"globals.h#include"util.h"#include"scan.h"#include"parse.h" static TokenType token; /holds current token static TreeNode * stmt_sequence(void);static TreeNode * sta
33、tement(void);static TreeNode * if_stmt(void);static TreeNode * while stmt(void);自定義函數(shù)static TreeNode * return stmt(void); static TreeNode * int stmt(void);static TreeNode * void stmt(void);static TreeNode * declaration(void); static TreeNode * parameter(void);static TreeNode * exp(void);static TreeN
34、ode * simple exp(void) static TreeNode * term(void);static TreeNode * factor(void);static void inFunction(void);static void syntaxError(char *message)fprintf(listing,"n>>>");fprintf(listing,"Syntax error at line %d: %s" lineno, message); Error = TRUE;static void match(To
35、kenType expected) if (token = expected)token = getToken();一elsesyntaxError("unexpected token->");printTOken(token, tokenString);fprintf(listing," ");TreeNode * stmt_sequence(void) TreeNode *t = statement。;TreeNode *p = t;while (token != ENDFILE) && (token != RBRACE) Tr
36、eeNode *q;/match(SEMI);q = statement。if (token != RBRACE)if (q != NULL)if (t = NULL) t = p = q;else!p->sibling = q;p = q;return t;TreeNode * statement(void) TreeNode *t = NULL;switch (token) 一case IF:t = if_stmt();Ibreak;case WHILE:t = while stmt();break;case ID: /偌為ID不直接進(jìn)行賦值,進(jìn)入exp()至factor。,將賦值加
37、入至factor() t = exp();break;case RETURN:t = return_stmt();break;case INT:t = int stmt();break;case VOID:t = void_stmt();break;case SEMI:match(SEMI);break;default:syntaxError("unexpected token -> ");printToken(token, tokenString);token = getToken();break;return t;TreeNode *declaration(voi
38、d)TreeNode *t = newDeclarationNode(token);if (t != NULL)名稱;token = getToken();ID賦給 t-> = copyString(tokenString);token = getToken();/tokens"("則為函數(shù)聲明if (token = LPAREN) t->kind.declaration = FunctionK;match(LPAREN);TreeNode *paramets = parameter(); 函數(shù)參數(shù)匹配 if (paramet
39、s != NULL)I. t->child0 = paramets;match(RPAREN)match(LBRACE);/匹配函數(shù)體TreeNode *body =: stmt_sequence()if (body = NULL)syntaxError('error body!");elset->child1 = body;match(RBRACE)J/token后不是(則是變量聲明else普通變量類型t->kind.declaration = VarK;進(jìn)入數(shù)組類型if (token = LBRACKET)match(LBRACKET);t->ki
40、nd.declaration =ArrayK;t->attr.size = atoi(tokenString);token = get1oken();match(RBRACKET);!match(SEMI);)return t;)TreeNode *parameter(void)TreeNode *t = NULL;if (token = VOID)match(VOID); 能吉束else if (token = RBRACE)return t;/侑參數(shù)elset = newDeclarationNode(token);token = getToken();t->
41、 = copyString(tokenString);token = getToken();/微組if (token = LBRACKET)0t->kind.declaration = ArrayK;match(LBRACKET);t->attr.size = 0;match(RBRACKET);/IDelset->kind.declaration = VarK;Iif (token = COMMA)match(COMMA);t->sibling = parameter。;口return t;TreeNode *if_stmt(void) TreeNode *t = n
42、ewStmtNode(IfK);Imatch(IF);if (t != NULL)match(LPAREN)t->child0 = exp(); match(RPAREN);if (t != NULL)/汝口果帶大括號(hào)if (token = LBRACE)match(LBRACE);while (token != RBRACE)t->child1 = statement。; match(RBRACE);/阮括號(hào)elset->child1 = statement。;if (token = ELSE)match(ELSE);if (t != NULL)如果帶大括號(hào)if (toke
43、n = LBRACE)match(LBRACE);while (token != RBRACE)t->child2 = statement。;match(RBRACE);無(wú)括號(hào)elset->child2 = statement。;return t;TreeNode *while_stmt(void)TreeNode *t = newStmtNode(WhileK); match(WHILE);TreeNode *p = NULL; match(LPAREN);while (token != RPAREN) if (t->child0 = NULL) P = exp(); t-
44、>child0 = p; elsep = p->child0 p = exp();match(RPAREN);/while函數(shù)大括號(hào)可有可無(wú)/汝果有括號(hào)if (token = LBRACE )match(LBRACE);while (token!=RBRACE)t->child1 = statement。; match(RBRACE);| 無(wú)elseIt->child1 = statement。; if (token = SEMI)match(SEMI);return t;TreeNode *return_stmt(void) TreeNode *t = newStmt
45、Node(ReturnK);t-> = copyString(tokenString);match(RETURN); if (token != SEMI)t->child0 = exp();match(SEMI);return t;TreeNode *int stmt(void)TreeNode *t = newDeclarationNode(INT); match(INT);t-> = copyString(tokenString);match(ID);/函數(shù)if (token = LPAREN)Omatch(RBRACE);else i
46、f (token = LBRACKET) t->kind.exp =Array expK; match(LBRACKET);t->child0 = exp(); match(RBRACKET);/度量Iif (token = SEMI)I_t->kind.declaration = VarK;match(SEMI); return t; /void函數(shù)TreeNode *void stmt(void)TreeNode *t = newDeclarationNode(VOID)match(VOID);t-> = copyString(tokenStrin
47、g);match(ID);match(LPAREN);if (token = VOID) match(VOID);elseinFunction()match(RPAREN);match(LBRACE);while (token!=RBRACE)statement。;match(RBRACE);return t;函數(shù)參數(shù)匹配void inFunction(void)match(INT);match(ID);if (token = LBRACKET)match(LBRACKET);match(RBRACKET);if (token = COMMA)match(COMMA);inFunction()
48、;TreeNode *exp(void)TreeNode *t = simple exp();if (token = LT) |(token=ASSIGN) | (token = EQ) | (token = RT) | (token = LTEQ) | (token = RTEQ) | (token =TreeNode *p = newExpNode(OpK);if (p != NULL) p->child0 = tp->attr.op = token;p-> = copyString(tokenString);t = p;)match(token);if
49、 (t != NULL)t->child1 = simple exp();return t;TreeNode *simple_exp(void)TreeNode *t = term();while (token = PLUS) | (token = MINUS)TreeNode *p = newExpNode(OpK);if (p != NULL)p->child0 = t;p->attr.op = token;p-> = copyString(tokenString);t = p;match(token);t->child1 = simple
50、exp()return t;TreeNode *term(void)ITreeNode *t = factor();if (token = TIMES) | (token = OVER) TreeNode *p = newExpNode(OpK);if (p != NULL) p->child0 = t;p->attr.op = token;p-> = copyString(tokenString); t = p;match(token); p->child1 = term();return t;TreeNode *factor(void) TreeN
51、ode *t = NULL;switch (token)case NUM:t = newExpNode(ConstK) if (t != NULL) && (token = NUM)t->attr.val = atoi(tokenString);match(NUM);break;case ID:t = newExpNode(IdK);/度量if (t != NULL) && (token = ID)t-> = copyString(tokenString);match(ID);/函數(shù)if (token = LPAREN)match(
52、LPAREN);t->kind.exp = Function expK;TreeNode *p = NULL;while (token != RPAREN)if (t->child0 = NULL)p = exp();t->child0 = p;elsep->sibling = exp();p = p->siblingif (token = COMMA)match(COMMA);match(RPAREN)/微組else if (token = LBRACKET) t->kind.exp = Array expK; match(LBRACKET);t->
53、child0 = exp(); match(RBRACKET);/W直if (token =ASSIGN) TreeNode *temp = newExpNode(OpK) temp->attr.op = token;temp-> = copyString(tokenString); match(ASSIGN);temp->child0 = t;t = temp;t->child1 = exp() if (token = SEMI) match(SEMI); break;case LPAREN:match(LPAREN);t = exp();match
54、(RPAREN);break;default:syntaxError("unexpected token -> "); printToken(token, tokenString);token = getToken();break;return t;/*the primary fuction of the parser*/TreeNode *parse(void) TreeNode *t;TreeNode *q;token = getToken();t = declaration。q = t;while (token != ENDFILE) t->sibling = declaration。; t = t->sibling; if (token != ENDFILE)syntaxError("Code ends before filen');fprintf(listing,"nparser treenp"return t; 3.4 util.c包括 void printToken( TokenTypetoken, const char* tokenString )函數(shù),void printTree( TreeNode* t)函數(shù),以及建
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 10在牛肚子里旅行 說(shuō)課稿-2024-2025學(xué)年三年級(jí)上冊(cè)語(yǔ)文統(tǒng)編版
- 16新年的禮物 (說(shuō)課稿)統(tǒng)編版道德與法治一年級(jí)上冊(cè)
- 2024年九年級(jí)語(yǔ)文上冊(cè) 第五單元 第9課《劉姥姥進(jìn)賈府》說(shuō)課稿 北師大版
- Unit 8 What's his job Part B(說(shuō)課稿)-2024-2025學(xué)年接力版(2024)英語(yǔ)三年級(jí)上冊(cè)001
- 邵陽(yáng)水下檢修施工方案
- 2024-2025學(xué)年高中生物 第一章 孟德爾定律 第二節(jié) 自由組合定律說(shuō)課稿3 浙科版必修2
- 8 秋天的收獲 說(shuō)課稿-2024-2025學(xué)年冀人版科學(xué)二年級(jí)上冊(cè)
- 保密協(xié)議 合同范例
- 輕鋼建筑公廁改造方案
- 7《中華民族一家親》(說(shuō)課稿)-部編版道德與法治五年級(jí)上冊(cè)
- 2024年鐵嶺衛(wèi)生職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 2025理論學(xué)習(xí)計(jì)劃2025年理論中心組學(xué)習(xí)計(jì)劃
- 2025年醫(yī)美醫(yī)院公司組織架構(gòu)和業(yè)務(wù)流程
- 防滑防摔倒安全教育
- 乳腺癌課件教學(xué)課件
- 連續(xù)性腎替代治療抗菌藥物劑量調(diào)整專家共識(shí)(2024年版)解讀
- 春節(jié)節(jié)后收心安全培訓(xùn)
- 2024年廣西區(qū)公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 高中物理斜面模型大全(80個(gè))
- 2025年高考物理復(fù)習(xí)壓軸題:電磁感應(yīng)綜合問(wèn)題(解析版)
- 2024-2030年芯片行業(yè)市場(chǎng)發(fā)展分析及發(fā)展趨勢(shì)前景預(yù)測(cè)報(bào)告
評(píng)論
0/150
提交評(píng)論