📄 pl.cpp
字号:
break;
}
}
}
delete tempList;delete tempList1;
}
void SIMPLEEXPRESSION(SYMLIST * list,TYPEITEM & typeItem) //获取一个“简单表达式”的信息
{
SYMBOL addop;
TYPEITEM helpTypeItem;
/////////////////////////////////////////////////
SYMLIST * tempList=new SYMLIST;
SYMLIST * tempList1=new SYMLIST;
tempList->AddHead(PLUS); tempList->AddHead(MINUS); tempList->AddHead(ORSYM);
COPYLIST(tempList1,listsAdd(tempList,list));
/////////////////////////////////////////////////
if(CurSymbol->type==PLUS || CurSymbol->type==MINUS)
{
addop=CurSymbol->type;
getASymbol();
TERM(tempList1,typeItem); //获取一个“项”的信息
if(addop==MINUS)
GEN(MUS,0,0);
}
else
TERM(tempList1,typeItem); //获取一个“项”的信息
while(SYMINLIST(CurSymbol->type,tempList))
{
addop=CurSymbol->type;
getASymbol();
TERM(tempList1,helpTypeItem); //获取一个“项”的信息
if(typeItem.typ!=helpTypeItem.typ) //如果两个项的信息发生冲突
{
error(37);//类型不一致
typeItem.typ=NOTYP;
typeItem.ref=0;
}
else
{
switch(addop)
{
case PLUS:
if(typeItem.typ==INTS)
GEN(ADD,0,0);
else
error(35);//操作数类型错误
break;
case MINUS:
if(typeItem.typ==INTS)
GEN(SUB,0,0);
else
error(35);//操作数类型错误
break;
case ORSYM:
if(typeItem.typ==BOOLS)
GEN(ORS,0,0);
else
error(35);//操作数类型错误
break;
}
}
}
delete tempList;delete tempList1;
}
void EXPRESSION(SYMLIST * list,TYPEITEM & typeItem) //获取一个“表达式”的信息
{
SYMBOL relationop;
TYPEITEM helpTypeItem;
/////////////////////////////////////////////////////////////////
SYMLIST * tempList=new SYMLIST;
SYMLIST * tempList1=new SYMLIST;
tempList->AddHead(EQL); tempList->AddHead(NEQ); tempList->AddHead(LSS);
tempList->AddHead(GTR); tempList->AddHead(LEQ); tempList->AddHead(GEQ);
COPYLIST(tempList1,listsAdd(tempList,list));
SIMPLEEXPRESSION(tempList1,typeItem); //获取一个“简单表达式”的信息
/////////////////////////////////////////////////////////////////
while(SYMINLIST(CurSymbol->type,tempList))
{
relationop=CurSymbol->type;
getASymbol();
SIMPLEEXPRESSION(list,helpTypeItem); ///获取一个“简单表达式”的信息
if(typeItem.typ!=helpTypeItem.typ)
error(37);//类型不一致
else
{
switch(relationop)
{
case EQL: GEN(EQ,0,0);break;
case NEQ: GEN(NE,0,0);break;
case LSS: GEN(LS,0,0);break;
case GEQ: GEN(GE,0,0);break;
case GTR: GEN(GT,0,0);break;
case LEQ: GEN(LE,0,0);break;
}
}
typeItem.typ=BOOLS;
}
delete tempList;delete tempList1;
}
void ARRAYELEMENT(SYMLIST * list,TYPEITEM & typeItem) //获取一个数组元素的信息
{
int p;
TYPEITEM helpTypeItem;
p=typeItem.ref;
if(CurSymbol->type==LBRACK)
{
SYMLIST * tempList=new SYMLIST;
COPYLIST(tempList,listAddSym(list,COMMA));
do
{
getASymbol();
EXPRESSION(tempList,helpTypeItem); //引用数组元素时所使用的数组下标的信息
if(typeItem.typ!=ARRAYS)
error(23); //下标个数不正确
else
{
if(helpTypeItem.typ!=ATAB[p].intType)
error(22); //数组元素引用时,下标元素类型出错
GEN(LIT,0,ATAB[p].low); //下面是产生的计算数组元素地址的代码
GEN(SUB,0,0);
GEN(LIT1,0,ATAB[p].elSize);
GEN(MULT,0,0);
GEN(ADD1,0,0);
typeItem.typ=ATAB[p].eleType;
typeItem.ref=ATAB[p].elRef;
p=ATAB[p].elRef;
}
}
while(CurSymbol->type==COMMA); //多维数组
if(CurSymbol->type==RBRACK)
getASymbol();
else
error(5);//应该是']'
}
else
error(4);//应该是'['
}
void INITIAL() //编译程序初始化所作的一些工作
{
nError=0;
displayLevel=0;
DISPLAY[0]=0;
DX=0;
CX=0;
BX=1;
TX=-1;
JX=0;
// FIVE SYMLISTS' INITIALIZATION
DECLBEGSYS.AddHead(CONSTSYM); DECLBEGSYS.AddHead(VARSYM);
DECLBEGSYS.AddHead(TYPESYM); DECLBEGSYS.AddHead(PROCSYM);
STATBEGSYS.AddHead(BEGINSYM); STATBEGSYS.AddHead(CALLSYM);
STATBEGSYS.AddHead(IFSYM); STATBEGSYS.AddHead(WHILESYM);
STATBEGSYS.AddHead(FORSYM); STATBEGSYS.AddHead(REPEATSYM);//
STATBEGSYS.AddHead(CASESYM);
FACBEGSYS.AddHead(IDENT); FACBEGSYS.AddHead(INTCON); FACBEGSYS.AddHead(LPAREN);
FACBEGSYS.AddHead(NOTSYM); FACBEGSYS.AddHead(CHARCON);
TYPEBEGSYS.AddHead(IDENT); TYPEBEGSYS.AddHead(ARRAYSYM);
CONSTBEGSYS.AddHead(PLUS); CONSTBEGSYS.AddHead(MINUS); CONSTBEGSYS.AddHead(INTCON);
CONSTBEGSYS.AddHead(CHARCON); CONSTBEGSYS.AddHead(IDENT);
}
void ENTERID(char * name,OBJECT kind,TYPES type,int value) //向符号表中填入信息要用的函数
{
TX++;
strcpy(NAMETAB[TX].name,name);
NAMETAB[TX].link=TX-1;
NAMETAB[TX].kind=kind;
NAMETAB[TX].type=type;
NAMETAB[TX].ref=0;
NAMETAB[TX].normal=1;
NAMETAB[TX].level=0;
switch(kind)
{
case VARIABLE:
case PROCEDURE:
NAMETAB[TX].unite.address=value;break;
case KONSTANT:
NAMETAB[TX].unite.value=value;break;
case TYPEL:
NAMETAB[TX].unite.size=value;break;
}
return;
}
void ENTERPREID() //预先填入符号表的信息,将这些信息作为“过程零”里面的数据
{
ENTERID("",VARIABLE,NOTYP,0);
ENTERID("char",TYPEL,CHARS,1);
ENTERID("integer",TYPEL,INTS,1);
ENTERID("boolean",TYPEL,BOOLS,1);
ENTERID("false",KONSTANT,BOOLS,0);
ENTERID("true",KONSTANT,BOOLS,1);
ENTERID("read",PROCEDURE,NOTYP,1);
ENTERID("write",PROCEDURE,NOTYP,2);
BTAB[0].last=TX;
BTAB[0].lastPar=1;
BTAB[0].pSize=0;
BTAB[0].vSize=0;
}
void ASSIGNMENT(SYMLIST * list) //分析赋值语句
{
TYPEITEM typeItem1,typeItem2;
int i;
i=GETPOSITION(CurSymbol->value.lpValue);
if(i==0)
error(33); //标识符没有定义
else
{
if (NAMETAB[i].kind!=VARIABLE) //':='左边应该是变量
{
error(16); //应该是变量
i=0;
}
getASymbol();
typeItem1.typ=NAMETAB[i].type;
typeItem1.ref=NAMETAB[i].ref;
if(NAMETAB[i].normal)
GEN(LODA,NAMETAB[i].level,NAMETAB[i].unite.address);
else
GEN(LOD,NAMETAB[i].level,NAMETAB[i].unite.address);
if(CurSymbol->type==LBRACK) //如果当前标识符是左大括号,那么正在为一个数组的元素赋值
{
//////////////////////////////////////////////////////////
SYMLIST * tempList=new SYMLIST;
COPYLIST(tempList,listAddSym(list,BECOMES));
ARRAYELEMENT(tempList,typeItem1); //获得此数组元素的信息
delete tempList;
//////////////////////////////////////////////////////////
}
if(CurSymbol->type==BECOMES)
getASymbol();
else
{
error(7); //应该是':='
if(CurSymbol->type==EQL)
getASymbol();
}
EXPRESSION(list,typeItem2); //':='右边是表达式
if(typeItem1.typ!=typeItem2.typ)
error(37);//类型不一致
else
{
if(typeItem1.typ==ARRAYS)
{
if(typeItem1.ref==typeItem2.ref)
GEN(CPYB,0,ATAB[typeItem1.ref].size);
else
error(35);//操作数类型出错
}
else
GEN(STO,0,0);
}
}
}
void IFSTATEMENT(SYMLIST * list) //分析if语句
{
TYPEITEM typeItem;
int fillBackFalse,fillBackTrue;
getASymbol();
/////////////////////////////////////////////////////////////////
SYMLIST * tempList=new SYMLIST;
COPYLIST(tempList,listAddSym(listAddSym(list,DOSYM),THENSYM));
EXPRESSION(tempList,typeItem); //获取布尔表达式的信息
delete tempList;
/////////////////////////////////////////////////////////////////
if(typeItem.typ!=BOOLS)
error(32); //if或while后面的表达式类型必须为布尔类型
if(CurSymbol->type==THENSYM)
getASymbol();
else
error(11); //应该是'then'
fillBackFalse=CX; //回填
GEN(JPC,0,0);
/////////////////////////////////////////////////////////////////
SYMLIST * tempList1=new SYMLIST;
COPYLIST(tempList1,listAddSym(list,ELSESYM));
STATEMENT(tempList1); //语句分析
delete tempList1;
/////////////////////////////////////////////////////////////////
if(CurSymbol->type==ELSESYM)
{
getASymbol();
fillBackTrue=CX; //回填
GEN(JMP,0,0);
CODE[fillBackFalse].address=CX;
JUMADRTAB[JX]=CX;
JX++;
STATEMENT(list);
CODE[fillBackTrue].address=CX;
JUMADRTAB[JX]=CX;
JX++;
}
else
{
CODE[fillBackFalse].address=CX;
JUMADRTAB[JX]=CX;
JX++;
}
}
void WHILESTATEMENT(SYMLIST * list) //while 语句的分析
{
TYPEITEM typeItem;
int jumpback,fillBackFalse;
getASymbol();
JUMADRTAB[JX]=CX;
JX++;
jumpback=CX; //纪录while循环执行时需要往前返回的地址
/////////////////////////////////////////////////////////////////
SYMLIST * tempList=new SYMLIST;
COPYLIST(tempList,listAddSym(list,DOSYM));
EXPRESSION(tempList,typeItem);
delete tempList;
/////////////////////////////////////////////////////////////////
if(typeItem.typ!=BOOLS)
error(32); //if或while后面的表达式类型应该是布尔类型
fillBackFalse=CX; //条件测试失败后从哪里往循环“外”跳
GEN(JPC,0,0);
if(CurSymbol->type==DOSYM)
getASymbol();
else
error(9);//应该是'do'
STATEMENT(list); //分析语句
GEN(JMP,0,jumpback);
CODE[fillBackFalse].address=CX; //回填
JUMADRTAB[JX]=CX;
JX++;
}
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
void REPEATSTATEMENT(SYMLIST * list) //repeat 语句的分析
{
TYPEITEM typeItem;
int jumpback;
getASymbol();
JUMADRTAB[JX]=CX;
JX++;
jumpback=CX; //纪录while循环执行时需要往前返回的地址
STATEMENT(list); //调用以前程序来分析语句
getASymbol();
if(CurSymbol->type==UNTILSYM)//测试当前字符的类型
getASymbol();//是'until'则取下一个
else
error(45);//不是'until'则报错
/////////////////////////////////////////////////////////////////
SYMLIST * tempList=new SYMLIST;
COPYLIST(tempList,listAddSym(list,SEMICOLON));
EXPRESSION(tempList,typeItem);
delete tempList;
/////////////////////////////////////////////////////////////////
if(typeItem.typ!=BOOLS)
error(32); //until后面的表达式类型应该是布尔类型
else
GEN(JPC,0,jumpback);//条件测试失败后由'jumpback=CX'跳出循环
/*if(CurSymbol->type!=SEMICOLON)
error(1);//应该是';'*/
}
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
void CASESTATEMENT(SYMLIST * list) //case ?????CASESTATEMENT
{
TYPEITEM typeItem;
int nextback[100]={0};
int next=0;
int jumpback;
int temp1;
TX++;//?????????
NAMETAB[TX].link=TX-1;
NAMETAB[TX].type=INTS;
NAMETAB[TX].ref=0;
NAMETAB[TX].normal=1;
NAMETAB[TX].level=displayLevel;
NAMETAB[TX].unite.address=DX;
DX+=3;
temp1=TX;
BTAB[DISPLAY[displayLevel]].last=TX;
getASymbol();
GEN(LODA,NAMETAB[temp1].level,NAMETAB[temp1].unite.address);//??
SYMLIST * tempList=new SYMLIST;
COPYLIST(tempList,listAddSym(list,OFSYM));
EXPRESSION(tempList,typeItem);//????
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -