资源简介

编译原理 Pascal 编译器 C语言实现 编译原理 Pascal 编译器 C语言实现 编译原理 Pascal 编译器 C语言实现 编译原理 Pascal 编译器 C语言实现 编译原理 Pascal 编译器 C语言实现

资源截图

代码片段和文件信息

// PL.cpp : Defines the entry point for the console application.
//
#include “common.h“

////////////////////////////////////////////////////////////
////////////////////////函数头定义如下//////////////////////
////////////////////////////////////////////////////////////

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);

////////////////////////////////////////////////////////////
////////////////////函数过程定义如下////////////////////////
////////////////////////////////////////////////////////////

void GEN(OPCOD funcint levelint address) //将产生的代码保存到代码数组CODE里面
{    //并将代码索引CX增加 1
static int lineNumber=0;
if(CX>MAXNUMOFCODEADDRESS)
{
printf(“PROGRAM TOO LONG!“);
exit(0);
}

printf(“%d\t“lineNumber);                 //下面三个语句用来在编译的过程中显示代码
printf(ObjCodescript[func]leveladdress); //注意:现实的代码不是完全的,但是可以帮助理解
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

评论

共有 条评论