資源簡介
編譯原理 Pascal 編譯器 C語言實現(xiàn)
編譯原理 Pascal 編譯器 C語言實現(xiàn)
編譯原理 Pascal 編譯器 C語言實現(xiàn)
編譯原理 Pascal 編譯器 C語言實現(xiàn)
編譯原理 Pascal 編譯器 C語言實現(xiàn)

代碼片段和文件信息
//?PL.cpp?:?Defines?the?entry?point?for?the?console?application.
//
#include?“common.h“
////////////////////////////////////////////////////////////
////////////////////////函數(shù)頭定義如下//////////////////////
////////////////////////////////////////////////////////////
SYMLIST?*?listsAdd(SYMLIST?*?list1SYMLIST?*?list2);
SYMLIST?*?listAddSym(SYMLIST?*?listSYMBOL?sym);
int?SYMINLIST(SYMBOL?symSYMLIST?*?list);
void?COPYLIST(SYMLIST?*?list1SYMLIST?*?list2);
void?error(int);
int?nError;
void?INITIAL();
void?ENTERID();
void?ENTERPREID();
void?getSymbols(FILE?*);
void?getASymbol();
void?destroySymbols();
SymbolItem?*Symbols=NULL;
SymbolItem?*CurSymbol=NULL;
void?GEN(OPCOD?funcint?levelint?address);
void?WriteObjCode(char?*);
void?WriteCodeList(char?*);
void?ENTERARRAY(SYMLIST?*?listTYPES?typeint?lowint?high);
void?ENTERBLOCK();
void?ENTER(object?object);
int?GETPOSITION(char?*?id);
void?CONSTANT(SYMLIST?*?listCONSTREC?&?constRec);
void?ARRAYTYP(SYMLIST?*?listint?&?arefint?&?arsz);
void?TYP(SYMLIST?*?listTYPES?&?tpint?&?rfint?&?sz);
void?PARAMENTERLIST(SYMLIST?*?list);
void?CONSTDECLARATION(SYMLIST?*?list);
void?TYPEDECLARATION(SYMLIST?*?list);
void?VARDECLARATION(SYMLIST?*?list);
void?PROCDECLARATION(SYMLIST?*?list);
void?FACTOR(SYMLIST?*?listTYPEITEM?&?typeItem);
void?TERM(SYMLIST?*?listTYPEITEM?&?typeItem);
void?SIMPLEexpression(SYMLIST?*?listTYPEITEM?&?typeItem);
void?expression(SYMLIST?*?listTYPEITEM?&?typeItem);
void?ARRAYELEMENT(SYMLIST?*?listTYPEITEM?&?typeItem);
void?ASSIGNMENT(SYMLIST?*?list);
void?IFSTATEMENT(SYMLIST?*?list);
void?WHILESTATEMENT(SYMLIST?*?list);
void?COMPOUND(SYMLIST?*?list);
void?STANDPROC(SYMLIST?*?listint?i);
void?CALL(SYMLIST?*?list);
void?STATEMENT(SYMLIST?*?list);
void?BLOCK(SYMLIST?*?listint?level);
////////////////////////////////////////////////////////////
////////////////////函數(shù)過程定義如下////////////////////////
////////////////////////////////////////////////////////////
void?GEN(OPCOD?funcint?levelint?address)?//將產生的代碼保存到代碼數(shù)組CODE里面
{ ???//并將代碼索引CX增加?1
static?int?lineNumber=0;
if(CX>MAXNUMOFCODEADDRESS)
{
printf(“PROGRAM?TOO?LONG!“);
exit(0);
}
printf(“%d\t“l(fā)ineNumber);?????????????????//下面三個語句用來在編譯的過程中顯示代碼
printf(ObjCodescript[func]leveladdress);?//注意:現(xiàn)實的代碼不是完全的,但是可以幫助理解
printf(“\n“);
CODE[CX].lineNumber=lineNumber++;
CODE[CX].func=func;
CODE[CX].level=level;
CODE[CX].address=address;
CX++;
}
void?WriteObjCode(char?*filename)??//將產生的代碼寫進*.pld文件里面(二進制形式)
{
FILE?*fcode;
fcode=fopen(filename“wb“);
if(!fcode)
error(40);??//不能打開.pld文件
for(int?i=0;i {
fwrite(&CODE[i].funcsizeof(OPCOD)1fcode);
fwrite(&CODE[i].levelsizeof(int)1fcode);
fwrite(&CODE[i].addresssizeof(int)1fcode);
}
fclose(fcode);
}
void?WriteCodeList(char?*filename)??//將產生的代碼寫進*.lst文件(可見字符形式)
{
FILE?*flist;
flist=fopen(filename“wb“);
if(!flist)
error(
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2010-12-10?20:32??PL\
?????文件????????5647??2010-12-10?16:42??PL\common.h
?????文件???????48369??2010-12-10?19:41??PL\PL.cpp
?????文件????????4045??2003-11-23?16:10??PL\pl.dsp
?????文件?????????529??2003-11-23?16:10??PL\PL.dsw
?????文件???????????9??2010-12-10?19:33??PL\pl.lab
?????文件?????????446??2010-12-10?19:33??PL\pl.lst
?????文件???????58368??2010-12-10?19:44??PL\PL.ncb
?????文件???????49664??2010-12-10?19:44??PL\PL.opt
?????文件?????????120??2010-12-10?19:33??PL\pl.pld
?????文件????????1148??2010-12-10?19:41??PL\pl.plg
?????文件??????????78??2010-12-10?19:41??PL\pl.txt
評論
共有 條評論