📄 down.h
字号:
#ifndef DOWN
#define DOWN
#include"include.h"
#include"PL.h"
struct
{ char vname[NLEN];//变量名
int rnum; //相对数
}VTable[VLEN]; //变量表
int Vptr=0; //指针,指向变量表的最后一项
struct
{ char pname[NLEN];//过程名
int parno;//参数个数
int varno;//过程变量个数+参数个数
int firstv;//第一个变量在VTable位置
int first4;//四元式
}PTable[PLEN];//过程表
int Pptr=0;////指针,指向变量表的最后一项
int sym=0;//记录当前处理的单词编码
int P2=-1;//指向二元式表,在递归下降分析时使用
/***********************************************************************************
* 查当前字符GetWord() *
***********************************************************************************/
int GetWord()
{
++P2;
if(table[P2].no==SEMA||table[P2].no==BEGIN||table[P2].no==END)lines++;
return table[P2].no;
}
/***********************************************************************************
* 递归下降分析主函数PROG() *
***********************************************************************************/
void PROG()
{
sym=GetWord();
if(sym==PROGRAM)
sym=GetWord();
else error(PROEXP);
if(sym==IDENT)
{
enterp(table[P2].name,0,0,0,PC);
sym=GetWord();
}else
error(IDERR);
if(sym==SEMA)
{ sym=GetWord();
lines++;
}
else
error(SEMAERR);
PP();
if((P2+1)==p)
{ error(SUCCESS);
return;}
else
error(EOFERR);
}
/***********************************************************************************
* 登记过程enterp()
* a:参数个数
b:变量个数
c:第一个变量在VTable位置
addr:第一个四元式地址
***********************************************************************************/
void enterp(char name[NLEN],int a,int b,int c,int addr)
{
for(int i=0;i<Vptr;i++)
{
if(!strcmp(name,PTable[i].pname)){
error(PREDEFINE);
}
}
strcpy(PTable[Pptr].pname,name);
PTable[Pptr].parno=a;
PTable[Pptr].varno=a+b;
PTable[Pptr].firstv=0;
PTable[Pptr].first4=addr;
Pptr++;
}
void enterv(char *name,int no)
{
for(int i=0;i<Vptr;i++)
{
if(!strcmp(name,VTable[i].vname)){
error(VREDEFINE);
}
}
strcpy(VTable[Vptr].vname,name);
VTable[Vptr].rnum=no;
Vptr++;
}
int findv(char *c)
{
//static i=0;
//i++;
//return i;
int i;
for(i=Vptr;strcmp(c,VTable[i].vname)&&i>0;i--);
return i;
}
void IDP()
{ sym=GetWord();
if(sym==IDENT){
int i=1;
PTable[Pptr].firstv=Vptr;
do{
enterv(table[P2].name,i);
sym=GetWord();
if(sym==DOU)sym=GetWord();
i++;
}while(sym==IDENT);
if(sym==SEMA)
{ PTable[Pptr].varno=i-1;
sym=GetWord();
return;
}else
error(SEMAERR);
}else
error(IDERR);
}
void PL()
{
// sym=GetWord();
PASER();
}
void PRP()
{
if(sym==PROCEDURE)
sym=GetWord();
else
error(PROCEEXP);
if(sym==IDENT)
{
enterp(table[P2].name,0,0,0,PC);
sym=GetWord();
}else
error(IDERR);
if(sym==SEMA)
{ sym=GetWord();
lines++;
}
else
error(SEMAERR);
if (sym==VAR)IDP();
if(sym==BEGIN)PL();
else
error(BEGINERR);
if(sym==END){
sym=GetWord();
return;
}else
error(ENDERR);
}
void PP()
{
if (sym=VAR)IDP();
while(sym==PROCEDURE) PRP();
/* if(sym=END)
{ sym=GetWord();
return;
}else
error(ENDERR);*/
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -