TINY部分源碼分析報(bào)告
《TINY部分源碼分析報(bào)告》由會(huì)員分享,可在線閱讀,更多相關(guān)《TINY部分源碼分析報(bào)告(23頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、精品資料 TINY源碼分析 一、文件概述 MAIN.C:主函數(shù) GLOBALS.H:全局定義的文件 SCAN.C/SCAN.H:詞法分析 PARSE.C/PARSE.H:語(yǔ)法分析 UTIL.C/UTIL.H:構(gòu)造樹(shù) SYMTAB.C/SYMTAB.H:符號(hào)表 CGEN.C/CGEN.H:生成"匯編代碼" CODE.C/CODE.H:這個(gè)只是用來(lái)把分析過(guò)程輸出到屏幕的. 二、各個(gè)文件的分析 1.MAIN.C: 主要有三個(gè)FILE*句柄: source--源代碼文件。 listing--顯示分析過(guò)程的文件,這里重定向到stdout。 code--目標(biāo)匯編代碼文件
2、。 從該文件中可知程序運(yùn)行的流程: 檢查參數(shù)正確否(tiny.exefilename)->構(gòu)造語(yǔ)法樹(shù)(調(diào)用parse函數(shù))->根據(jù)語(yǔ)法樹(shù)生成代 碼(調(diào)用codeGen函數(shù),該函數(shù)又調(diào)用cGen函數(shù)。 2.GLOBALS.H: 定義了關(guān)鍵字個(gè)數(shù)8個(gè)。 定義了關(guān)鍵字,運(yùn)算符等內(nèi)容的枚舉值。 定義了語(yǔ)句類(lèi)型的枚舉值,這個(gè)決定樹(shù)的結(jié)點(diǎn)。 可編輯修改 定義了變量類(lèi)型(也就三種,void,integer,boolean)。 定義了樹(shù)的節(jié)點(diǎn)--這個(gè)最重要了!!其結(jié)構(gòu)如下所示: typedefstructtreeNode { structtreeNode*child[MAXCHI
3、LDREN]; structtreeNode*sibling; intlineno; NodeKindnodekind; union{StmtKindstmt;ExpKindexp;}kind; union{TokenTypeop; intval; char*name;}attr; ExpTypetype;/*fortypecheckingofexps*/ }TreeNode; 3.UTIL.C/UTIL.H 主要函數(shù) TreeNode*newStmtNode(StmtKindkind) 此函數(shù)創(chuàng)建一個(gè)有關(guān)語(yǔ)法樹(shù)的聲明節(jié)點(diǎn) TreeNode*newExpNode(E
4、xpKindkind) 此函數(shù)創(chuàng)建一個(gè)有關(guān)語(yǔ)法樹(shù)的表述節(jié)點(diǎn) char*copyString(char*s) 此函數(shù)分配和創(chuàng)建一個(gè)新的已存在樹(shù)的復(fù)制 voidprintTree(TreeNode*tree) 輸出一個(gè)語(yǔ)法樹(shù) 這兩個(gè)文件主要是關(guān)于語(yǔ)法樹(shù)的創(chuàng)建和輸出 4.SCAN.c/SCAN.H 主要有這么幾個(gè)函數(shù):staticintgetNextChar(void); staticvoidungetNextChar(void); staticTokenTypereservedLookup(char*s); TokenTypegetToken(void); reserved
5、Lookup函數(shù)是查找關(guān)鍵字的,在符號(hào)表中找。這里還定義了一個(gè)保存關(guān)鍵字的結(jié) 構(gòu): staticstruct {char*str; TokenTypetok; }reservedWords[MAXRESERVED] {{"if",IF},{"then",THEN},{"else",ELSE},{"end",END}, {"repeat",REPEAT},{"until",UNTIL},{"read",READ}, {"write",WRITE}}; 最重要的是getToken(void)函數(shù)。這個(gè)相當(dāng)于lex的功能,進(jìn)行詞法分析。也就是一個(gè)DFA, switch后面跟了一堆
6、的case。
其中g(shù)etNextChar(void)函數(shù)的思路,以下列出:
staticintgetNextChar(void)
{
if(!(linepos 7、turnEOF;
}
}
elsereturnlineBuf[linepos++];
}
4.PARSE.C/PARSE.H
有這么幾個(gè)函數(shù):
TreeNode*parse(void)
staticTreeNode*stmt_sequence(void);
staticTreeNode*statement(void);
staticTreeNode*if_stmt(void);
staticTreeNode*repeat_stmt(void);
staticTreeNode*assign_stmt(void);
staticTreeNode*read_stmt(vo 8、id);
staticTreeNode*write_stmt(void);
staticTreeNode*exp(void);
staticTreeNode*simple_exp(void);
staticTreeNode*term(void);
staticTreeNode*factor(void);
最重要的是parse這個(gè)函數(shù),就是用來(lái)構(gòu)造整個(gè)程序的語(yǔ)法樹(shù)的。下面的一堆私有函數(shù)構(gòu)
造相應(yīng)語(yǔ)法的語(yǔ)法樹(shù),然后parse最后把它們這些子樹(shù)整合成一個(gè)大樹(shù)。
5.SYMTAB.C/SYMTAB.H
這個(gè)是符號(hào)表操作的,也就是詞法分析的時(shí)候查找表,看該token是不是關(guān)鍵字。如果不 9、
是,就當(dāng)作表識(shí)符添加進(jìn)去。在語(yǔ)法分析的時(shí)候也要用到,看變量有沒(méi)有聲明的時(shí)候用的。
三、實(shí)驗(yàn)心得:
通過(guò)這次實(shí)驗(yàn),仔細(xì)地去查看和分析了TINY編譯器的部分源碼。了解到了編譯器的運(yùn)
行:檢查參數(shù)正確否(tiny.exefilename)->構(gòu)造語(yǔ)法樹(shù)(調(diào)用parse函數(shù))->根據(jù)語(yǔ)法樹(shù)生
成代碼(調(diào)用codeGen函數(shù)),同時(shí)熟悉了編譯器是如何使用prase函數(shù)進(jìn)行語(yǔ)法樹(shù)的構(gòu)
建以及語(yǔ)法樹(shù)生成代碼的轉(zhuǎn)化,最主要的是進(jìn)一步清晰了解到編譯器的構(gòu)造和運(yùn)行原理,加
深了對(duì)課本知識(shí)的運(yùn)用和拓展,感覺(jué)收獲很大!
Main.c/********************************* 10、*******************/
*/
*/
*/
*/
/*File:main.c
/*MainprogramforTINYcompiler
/*CompilerConstruction:PrinciplesandPractice
/*KennethC.Louden
/**
************************************************
**/
#include "globals.h
/* set NO_PARSE to TRUE to get a scanner-only compiler
創(chuàng)建一個(gè)只掃描的編譯器 * 11、/
#define NO_PARSE FALSE
/* set NO_ANALYZE to TRUE to get a parser-only compiler
時(shí)創(chuàng)建一個(gè)只分析和掃描的編譯器 */
#define NO_ANALYZE FALSE
NO_PARSE 為 true 時(shí)
NO_ANALYZE 為 true
/*setNO_CODEtoTRUEtogetacompilerthatdoesnot
*generatecodeNO_CODE為true時(shí)創(chuàng)建一個(gè)執(zhí)行語(yǔ)義分析,但不生成代碼的編譯器
*/
#include "util.h"
#if NO_PARSE 12、 #include "scan.h" #else
#include "parse.h" #if !NO_ANALYZE #include "analyze.h #if !NO_CODE #include "cgen.h" #endif
#defineNO_CODEFALSE
//如果NO_PARSE為true,調(diào)用頭文件scan.h
//否則調(diào)用頭文件prase.h
//如果NO_ANALYZE為true,調(diào)用頭文件analyze.h
//如果NO_CODE為true,調(diào)用頭文件cgen.h#endif
#endif//結(jié)束預(yù)處理語(yǔ)句符號(hào)
/*allocateglobalvar 13、iables分配全局變量*/
intlineno=0;
FILE*source;//指針指向源代碼文件地址
FILE*listing;//指針指向顯示分析過(guò)程的文件的地址
FILE*code;//指針指向目標(biāo)匯編代碼文件的地址
/*allocateandsettracingflags分配和設(shè)置跟蹤標(biāo)志*/
intEchoSource=FALSE;
intTraceScan=FALSE;
intTraceParse=FALSE;
intTraceAnalyze=FALSE;
intTraceCode=FALSE;
intError=FALSE;//跟蹤標(biāo)志全部初始化為fal 14、semain(intargc,char*argv[])
{TreeNode*syntaxTree;
charpgm[120];/*sourcecodefilename*/
if(argc!=2)
{fprintf(stderr,"usage:%s 15、/把.tyn文件所指字符串添加到pgm結(jié)尾處并添加'\0'。
source=fopen(pgm,"r");//以只讀的方式打開(kāi)pgm文件,并將指向pgm文件的
指針?lè)祷亟osource
if(source==NULL)
{fprintf(stderr,"File%snotfound\n",pgm);
exit(1);//如果源代碼文件為空,打印顯示信息并退出
}
listing=stdout;/*sendlistingtoscreen清單發(fā)送到屏幕*/
fprintf(listing,"\nTINYCOMPILATION:%s\n",pgm);//答應(yīng)顯示語(yǔ)句
#ifNO_PA 16、RSE
while(getToken()!=ENDFILE);//如果輸入流沒(méi)有結(jié)束就繼續(xù)進(jìn)行循環(huán),直至結(jié)束
#else
syntaxTree=parse();//調(diào)用prase()函數(shù)構(gòu)造語(yǔ)法樹(shù)
if(TraceParse){
fprintf(listing,"\nSyntaxtree:\n");
printTree(syntaxTree);//如果語(yǔ)法分析追蹤標(biāo)志為T(mén)RUE且沒(méi)有語(yǔ)法錯(cuò)誤,則將生
成的語(yǔ)法樹(shù)輸出到屏幕
}
#if!NO_ANALYZE
if(!Error)
{if(TraceAnalyze)fprintf(listing,"\nBuildingSymb 17、olTable...\n");
buildSymtab(syntaxTree);//輸出含符號(hào)表信息的語(yǔ)法樹(shù)
if(TraceAnalyze)fprintf(listing,"\nCheckingTypes...\n");
typeCheck(syntaxTree);//輸出含類(lèi)型檢查的語(yǔ)法樹(shù)
if(TraceAnalyze)fprintf(listing,"\nTypeCheckingFinished\n");//打印結(jié)束信息
}
#if!NO_CODE
if(!Error)
{char*codefile;
intfnlen=strcspn(pgm,".");
codef 18、ile=(char*)calloc(fnlen+4,sizeof(char));
strncpy(codefile,pgm,fnlen);
strcat(codefile,".tm");//將源文件名,去掉擴(kuò)展名,添加擴(kuò)展名.tm
code=fopen(codefile,"w");//以只寫(xiě)的方式打開(kāi)目標(biāo)匯編代碼文件,并返回地址給
codez指針
if(code==NULL)
{printf("Unabletoopen%s\n",codefile);
exit(1);//如果code指針為空,打印顯示信息并退出
}
codeGen(syntaxTree,codefile);/ 19、/目標(biāo)代碼生成
fclose(code);
}
#endif
#endif
#endif//結(jié)束之前對(duì)應(yīng)的條件編譯fclose(source);//關(guān)閉源代碼文件return0;
}
GLOBALS.H
/****************************************************/
/*File:globals.h*/
/*GlobaltypesandvarsforTINYcompiler*/
/*mustcomebeforeotherincludefiles*/
/*CompilerConstruction:PrinciplesandPr 20、actice*/
/*KennethC.Louden*//****************************************************/
#ifndef_GLOBALS_H_
#define_GLOBALS_H_//宏定義
#include 21、#endif
/*MAXRESERVED=thenumberofreservedwords*/
#defineMAXRESERVED8//定義了關(guān)鍵字個(gè)數(shù)8個(gè)
typedefenum
/*book-keepingtokens*/
{ENDFILE,ERROR,
/*reservedwords*/
IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE,
/*multicharactertokens*/
ID,NUM,
/*specialsymbols*/
ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAR 22、EN,SEMI
}TokenType;//定義了關(guān)鍵字,運(yùn)算符等內(nèi)容的枚舉值
externFILE*source;/*sourcecodetextfile
externFILE*listing;/*listingoutputtextfile
源代碼地址 */
顯示分析過(guò)程的文件的地址 */
目標(biāo)匯編代碼文件的地址 */
externFILE*code;/*codetextfileforTMsimulatorexternintlineno;/*sourcelinenumberforlisting*//**************************************** 23、**********/
/***********
Syntaxtreeforparsing************//**************************************************/typedefenum{StmtK,ExpK}NodeKind;//定義了語(yǔ)句類(lèi)型的枚舉值,這個(gè)決定樹(shù)的節(jié)
點(diǎn)
typedefenum{IfK,RepeatK,AssignK,ReadK,WriteK}StmtKind;
typedefenum{OpK,ConstK,IdK}ExpKind;
/*ExpTypeisusedfortypechecking*/
typ 24、edefenum{Void,Integer,Boolean}ExpType;//定義了變量類(lèi)型
#defineMAXCHILDREN3//定義了最大子節(jié)點(diǎn)
typedefstructtreeNode//定義了樹(shù)的節(jié)點(diǎn)
{structtreeNode*child[MAXCHILDREN];
structtreeNode*sibling;
intlineno;
NodeKindnodekind;
union{StmtKindstmt;ExpKindexp;}kind;
union{TokenTypeop;
intval;
char*name;}attr;
ExpTypetyp 25、e;/*fortypecheckingofexps*/
}TreeNode;
/***********
Flags for tracing
************/
/**************************************************/
/**************************************************/
/*EchoSource=TRUEcausesthesourceprogramto
* beechoedtothelistingfilewithlinenumbers
* duringparsing
26、* /
externintEchoSource;
/*TraceScan=TRUEcausestokeninformationtobe
* printedtothelistingfileaseachtokenis
* recognizedbythescanner
* /
externintTraceScan;
/*TraceParse=TRUEcausesthesyntaxtreetobe
* printedtothelistingfileinlinearizedform
* (usingindentsforchildren)
* /
externintTracePars 27、e;
/*TraceAnalyze=TRUEcausessymboltableinserts
* andlookupstobereportedtothelistingfile
*/
externintTraceAnalyze;
/*TraceCode=TRUEcausescommentstobewritten
* totheTMcodefileascodeisgenerated
*/
externintTraceCode;
/*Error=TRUEpreventsfurtherpassesifanerroroccurs*/externintError;
#endif
SC 28、AN.C
/*詞法掃描程序*/
#include"globals.h"
#include"util.h"
#include"scan.h"
/*定義的狀態(tài)*/
typedefenum
{
START,/*初始狀態(tài)*/
INASSIGN,/*進(jìn)入到賦值狀態(tài)*/
INCOMMENT,/*進(jìn)入到注釋狀態(tài)*/
INNUM,/*進(jìn)入到數(shù)字狀態(tài)*/
INID,/*進(jìn)入到標(biāo)志符狀態(tài)*/
DONE/*狀態(tài)結(jié)束*/
}StateType;
/*每當(dāng)語(yǔ)法分析程序需要一個(gè)單詞時(shí),就調(diào)用該子程序,得到(類(lèi)別碼,單詞的值)*//*語(yǔ)義標(biāo)識(shí)符和保留字*/
chartokenString[M 29、AXTOKENLEN+1];
/*BUFLEN=源代碼的輸入緩沖長(zhǎng)度*/
#defineBUFLEN256
staticcharlineBuf[BUFLEN];/*當(dāng)前行*/
staticintlinepos=0;/*在linebuf中的當(dāng)前位置*/
staticintbufsize=0;/*緩沖區(qū)的字符串當(dāng)前大小*/
staticintEOF_flag=FALSE;/*如果讀入下一個(gè)字符出錯(cuò),設(shè)置EOF_flag為假。*/
/*從linebuffer中讀取下一個(gè)非空白字符,如果讀完,則讀入新行。*/staticintgetNextChar(void){if(!(linepos< 30、bufsize))
{lineno++;
if(fgets(lineBuf,BUFLEN-1,source))
{if(EchoSource)fprintf(listing,"%4d:%s",lineno,lineBuf);
bufsize=strlen(lineBuf);
linepos=0;
returnlineBuf[linepos++];
}
else
{EOF_flag=TRUE;
returnEOF;
}
}
elsereturnlineBuf[linepos++];
}
/*如果讀入下一個(gè)字符出錯(cuò),在linebuf中回退一個(gè)字符。*/
static 31、voidungetNextChar(void)
{if(!EOF_flag)linepos--;}
/*保留字的查找表*/
staticstruct
{char*str;
TokenTypetok;
}reservedWords[MAXRESERVED]
={{"if",IF},{"then",THEN},{"else",ELSE},{"end",END},
{"repeat",REPEAT},{"until",UNTIL},{"read",READ},{"write",WRITE}};
/*標(biāo)識(shí)符是否是保留字*/
staticTokenTypereservedLookup 32、(char*s)
{inti;
for(i=0;i 33、e=START;
/*表示保存到tokenstring的flag*/
intsave;
while(state!=DONE)
{
intc=getNextChar();/*從輸入buf中讀入一個(gè)字符*/
save=TRUE;
switch(state)
{
caseSTART:
if(isdigit(c))
state=INNUM;
elseif(isalpha(c))/*判斷字母*/
state=INID;
elseif(c==':')
state=INASSIGN;
elseif((c=='')||(c=='/t')||(c=='/n'))
save=FA 34、LSE;
elseif(c=='{')
{
save=FALSE;
state=INCOMMENT;
}else
{
state=DONE;switch(c){caseEOF:
save=FALSE;
currentToken=ENDFILE;
break;
case'=':
currentToken=EQ;
break;
case'<':
currentToken=LT;break;
case'+':
currentToken=PLUS;break;
case'-':
currentToken=MINUS;break;
case
currentTok 35、en=TIMES;break;
case'/':
currentToken=OVER;break;
case'(':
currentToken=LPAREN;
break;
case')':
currentToken=RPAREN;
break;
case';':
currentToken=SEMI;
break;
default:
currentToken=ERROR;
break;
}
}
break;
caseINCOMMENT:
save=FALSE;
if(c==EOF)
{
state=DONE;
currentToken=ENDFIL 36、E;
}
elseif(c=='}')state=START;
break;
caseINASSIGN:
state=DONE;
if(c=='=')
currentToken=ASSIGN;
else{
/*在輸入中備份*/
ungetNextChar();
save=FALSE;
currentToken=ERROR;
}
break;
caseINNUM:
if(!isdigit(c))
{
/*在輸入中備份*/
ungetNextChar();
save=FALSE;
state=DONE;
currentToken=NUM;
}
bre 37、ak;
caseINID:
if(!isalpha(c))
{
/*在輸入中備份*/
ungetNextChar();
save=FALSE;
state=DONE;
currentToken=ID;
}
break;
caseDONE:
default:/*應(yīng)該不會(huì)執(zhí)行*/
fprintf(listing,"ScannerBug:state=%d/n",state);
state=DONE;
currentToken=ERROR;
break;
}
if((save)&&(tokenStringIndex<=MAXTOKENLEN))
{
tokenS 38、tring[tokenStringIndex++]=(char)c;
}
/*解析單詞結(jié)束*/
if(state==DONE)
{
tokenString[tokenStringIndex]='/0';
if(currentToken==ID)
{
currentToken=reservedLookup(tokenString);
}
}
}
if(TraceScan)
{
fprintf(listing,"/t%d:",lineno);
printToken(currentToken,tokenString);
}
returncurrentToken;
39、}
SCAN.H/****************************************************//*對(duì)于tiny編譯器的掃描程序接口*//****************************************************/#ifndef_SCAN_H_
#define_SCAN_H_
/*maxtokenlen是token的最大大小*/
#defineMAXTOKENLEN40
/*tokenString數(shù)組保存每個(gè)token*/
externchartokenString[MAXTOKENLEN+1];
/*f函數(shù)getToke 40、n返回源程序中的下一個(gè)token*/
TokenTypegetToken(void);
#endif
UTIL.H
/****************************************************/
*/
/*File:util.h
/*UtilityfunctionsfortheTINYcompiler*/
/*CompilerConstruction:PrinciplesandPractice*/
*/
/*KennethC.Louden/****************************************************/ 41、
#ifndef_UTIL_H_
#define_UTIL_H_
/*ProcedureprintTokenprintsatoken
* anditslexemetothelistingfile
* /
voidprintToken(TokenType,constchar*);
/*FunctionnewStmtNodecreatesanewstatement
* nodeforsyntaxtreeconstruction
* /
TreeNode*newStmtNode(StmtKind);
/*FunctionnewExpNodecreatesanewexpressi 42、on
* nodeforsyntaxtreeconstruction
* /
TreeNode*newExpNode(ExpKind);
/*FunctioncopyStringallocatesandmakesanew
* copyofanexistingstring
* /
char*copyString(char*);
/*procedureprintTreeprintsasyntaxtreetothe
* listingfileusingindentationtoindicatesubtrees
* /
voidprintTree(TreeNode*);
#en 43、dif
UTIL.C/****************************************************/
*/
/*File:util.c
/*Utilityfunctionimplementation*/
/*fortheTINYcompiler*/
/*CompilerConstruction:PrinciplesandPractice*/
*/
/*KennethC.Louden/****************************************************/
#include"globals.h
#include"u 44、til.h"
/*ProcedureprintTokenprintsatoken
* anditslexemetothelistingfile
此函數(shù)輸出一個(gè)標(biāo)號(hào)
*/voidprintToken(TokenTypetoken,constchar*tokenString)//
和一個(gè)詞素
{switch(token)
{caseIF:
caseTHEN:
caseELSE:
caseEND:
caseREPEAT:
caseUNTIL:
caseREAD:
caseWRITE:
fprintf(listing,
"reservedword:%s\n",toke 45、nString);
break;
caseASSIGN:fprintf(listing,":=\n");break;
caseLT:fprintf(listing,"<\n");break;
caseEQ:fprintf(listing,"=\n");break;
caseLPAREN:fprintf(listing,"(\n");break;
caseRPAREN:fprintf(listing,")\n");break;
caseSEMI:fprintf(listing,";\n");break;
casePLUS:fprintf(listing,"+\n");break; 46、
caseMINUS:fprintf(listing,"-\n");break;
caseTIMES:fprintf(listing,"*\n");break;
caseOVER:fprintf(listing,"/\n");break;
caseENDFILE:fprintf(listing,"EOF\n");break;
caseNUM:
fprintf(listing,
"NUM,val=%s\n",tokenString);
break;
caseID:
fprintf(listing,
"ID,name=%s\n",tokenString);
break;
47、caseERROR:
fprintf(listing,
"ERROR:%s\n",tokenString);
break;
default:/*shouldneverhappen*/
fprintf(listing,"Unknowntoken:%d\n",token);
/*FunctionnewStmtNodecreatesanewstatement
* nodeforsyntaxtreeconstruction
* /
TreeNode*newStmtNode(StmtKindkind)//此函數(shù)創(chuàng)建一個(gè)有關(guān)此法樹(shù)的聲明節(jié)點(diǎn)
{TreeNode*t=(TreeNode* 48、)malloc(sizeof(TreeNode));
inti;
if(t==NULL)
fprintf(listing,"Outofmemoryerroratline%d\n",lineno);
else{
for(i=0;i 49、yntaxtreeconstruction
*/
TreeNode*newExpNode(ExpKindkind)//此函數(shù)創(chuàng)建一個(gè)有關(guān)此法樹(shù)的表述節(jié)點(diǎn)
{TreeNode*t=(TreeNode*)malloc(sizeof(TreeNode));
inti;
if(t==NULL)
fprintf(listing,"Outofmemoryerroratline%d\n",lineno);
else{
for(i=0;i 50、d.exp=kind;
t->lineno=lineno;
t->type=Void;
}
returnt;
}
/*FunctioncopyStringallocatesandmakesanew
*copyofanexistingstring
*/
char*copyString(char*s)//此函數(shù)分配和創(chuàng)建一個(gè)新的已存在樹(shù)的復(fù)制
{intn;
char*t;
if(s==NULL)returnNULL;
n=strlen(s)+1;
t=malloc(n);
if(t==NULL)
fprintf(listing,"Outofmemoryerrorat 51、line%d\n",lineno);
elsestrcpy(t,s);
returnt;
}
/*VariableindentnoisusedbyprintTreeto
* storecurrentnumberofspacestoindent
*/
staticindentno=0;//此變量被函數(shù)printTree用來(lái)存儲(chǔ)要縮進(jìn)的空格個(gè)數(shù)
/*macrostoincrease/decreaseindentation*/
#defineINDENTindentno+=2//這個(gè)宏增加縮進(jìn)空格個(gè)數(shù)
#defineUNINDENTindentno-=2//這個(gè)宏減少縮進(jìn)空格個(gè)數(shù) 52、
/*printSpacesindentsbyprintingspaces*/
staticvoidprintSpaces(void)//此函數(shù)通過(guò)打印空格縮進(jìn)
{inti;
for(i=0;i 53、ree!=NULL){
printSpaces();
if(tree->nodekind==StmtK)
{switch(tree->kind.stmt){
caseIfK:
fprintf(listing,"If\n");
break;
caseRepeatK:
fprintf(listing,"Repeat\n");
break;
caseAssignK:
fprintf(listing,"Assignto:%s\n",tree->attr.name);break;
caseReadK:
fprintf(listing,"Read:%s\n",tree->attr 54、.name);break;
caseWriteK:
fprintf(listing,"Write\n");
break;
default:
fprintf(listing,"UnknownExpNodekind\n");
break;
}
}
elseif(tree->nodekind==ExpK)
{switch(tree->kind.exp){
caseOpK:
fprintf(listing,"Op:");
printToken(tree->attr.op,"\0");
break;
caseConstK:
fprintf(listing,"Const:% 55、d\n",tree->attr.val);
break;
caseIdK:
fprintf(listing,"Id:%s\n",tree->attr.name);
break;
default:
fprintf(listing,"UnknownExpNodekind\n");
break;
}
}
elsefprintf(listing,"Unknownnodekind\n");
for(i=0;i
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫(kù)試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫(kù)試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫(kù)試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫(kù)及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫(kù)含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案