📄 pll.h
字号:
case constant:
//const
if(num>amax||(int)fnum>amax)
{
//address over flow
printerr(24);//
num=0;
}
if(t==integer)
{
table[(*ptx)].val_int=num;
}
if(t==plchar)
{
table[(*ptx)].c=char_buffer;
// printf("filltable :the char_buffer is :%c\n",table[(*ptx)].c);
}
if(t==string)
{
strcpy(&(table[(*ptx)].string[0]),&string_buffer[0]);
}
if(t==real)
table[(*ptx)].val_real=fnum;
break;
case var:
table[(*ptx)].level=lev;//the level
table[(*ptx)].adr=(*pdx);
///
(*pdx)++;//add the address
break;
case procedure:
table[(*ptx)].level=lev;
break;
case function:
table[(*ptx)].level=lev;
break;
////
case parameter:
table[(*ptx)].level=lev;
break;
}
}
int position(char *idt,int tx)
{
int i;
strcpy(&(table[0].name[0]),idt);
i=tx;
while(strcmp(&(table[i].name[0]),idt)!=0)
{
i--;
}
return i;
}
int deal_statement(bool *fsys,int *ptx,int lev)
{
int i,cx1;
int case_flag1=0;
int case_jmp[10];//最多有十个分支
int case_flag2=0;
int add_flag=1;
int p_procedure;
bool nextlev[keynum];
enum typeset ident_buffer;
enum typeset temp;
bool statement_firstset[keynum];//define the firstset of the statement_firset
for(i=0;i<keynum;i++)
statement_firstset[i]=false;
statement_firstset[beginsym]=true;
statement_firstset[ifsym]=true;
statement_firstset[forsym]=true;
statement_firstset[casesym]=true;
statement_firstset[writesym]=true;
statement_firstset[readsym]=true;
statement_firstset[ident]=true;
statement_firstset[nul]=true;
if(sym==ident)
{
//getsymdo;
/*如果是函数调用语句,
则对参数进行处理,
关键!!
*/
i=position(id,*ptx);
if(i==0)
{
printerr(25);
}
//can't find the var
else
{
if(table[i].kind==function)
{
//pa.i=table[i].adr;
//do_genecode(cal,lev-table[i].level,pa,integer);
getsymdo;
// p_procedure=i;
if(sym!=assign)
printerr(46);
else
do_deal_expression(nextlev,ptx,lev);
//}
/*if(sym!=lparen)
{
if(table[i+1].kind==parameter)
printerr(34);
if(sym!=assign)
printerr(46);
else
do_deal_expression(fsys,ptx,lev);
}
else
{
do{
getsymdo;//get the parameter
i=position(id,*ptx);
if(i==0)
{
printerr(34);
}
if(table[i+1].kind!=parameter)///
{
printerr(34);
}
temp=table[++p_procedure].type;
//考虑参数的装载.
if(!(temp==integer&&sym==integersym)&&!(temp==real&&sym==realsym)&&!(temp==plchar&&sym==charsym))//if(temp!=table[i].type)
{
printerr(35);
}
getsymdo;//get the next one
}while(sym==comma);
p_procedure=0;////////////////
if(sym!=rparen)
{
printerr(7);
}
getsymdo;
if(sym!=assign)
printerr(46);
else
do_deal_expression(fsys,ptx,lev);
if(sym!=semicolon)
printerr(0);
else
getsymdo;
}*/
}
if(table[i].kind==procedure)
{
//printerr(26);
//i=0;
//genecode
//printf("应该在此处理过程.\n");
pa.i=table[i].adr;
do_genecode(cal,lev-table[i].level,pa,integer);
getsymdo;
p_procedure=i;
if(sym!=lparen)
{
if(table[i+1].kind==parameter)
{
printerr(34);
}//have some useful information
if(sym!=semicolon)
{
printerr(0);
//i=0;
}
else
getsymdo;
}
else//有实参
{
do{
getsymdo;//get the parameter
i=position(id,*ptx);
if(i==0)
{
printerr(34);
}
if(table[i+1].kind!=parameter)///
{
printerr(34);
}
temp=table[++p_procedure].type;
//考虑参数的装载.
if(!(temp==integer&&sym==integersym)&&!(temp==real&&sym==realsym)&&!(temp==plchar&&sym==charsym))//if(temp!=table[i].type)
{
printerr(35);
}
getsymdo;//get the next one
}while(sym==comma);
p_procedure=0;////////////////
if(sym!=rparen)
{
printerr(7);
}
getsymdo;
if(sym!=semicolon)
{
// ;
printerr(0);
}
getsymdo;
}
}// if it is the var or parameter or value sentence
if(table[i].kind==var||table[i].kind==parameter)//find to here
{
getsymdo;//get the next sym;
ident_buffer=table[i].type;//buffer the type
if(sym==assign)/////////////:=
{
getsymdo;
}
else
{
printerr(8);// no :=
}
//如果是用函数赋值语句
if(position(id,*ptx))
{
memcpy(nextlev,fsys,sizeof(bool)*keynum);
do_deal_expression(nextlev,ptx,lev);//处理符号右侧的表达式
//the level should be changed.
if(i!=0)
{
//use the command sto to value
pa.i=table[i].adr;
do_genecode(sto,lev-table[i].level,pa,integer);
}
}
}
}
}
//}/////////////////
else if(sym==readsym)
//read 语句//
//vip
{
getsymdo;
if(sym!=lparen)
{
printerr(27);//wrong of the read sentence
}
else
{
//lparen
do
{
getsymdo;
//get the next symbol
if(sym==ident)
//sym is an ident
{
i=position(id,*ptx);
//查找要读的变量.
}
else
{
i=0;//vip///其它均认为是错.
}
if(i==0)
{
printerr(28);
}
else
{
//在table中找到了对应的变量
///此处应该对类型进行考虑.
//???????
//生成代码
temp=table[i].type;
if(temp==integer)
{
pa.i=16;
}
else
{
pa.i=17;
}
do_genecode(opr,0,pa,integer);
pa.i=table[i].adr;
do_genecode(sto,lev-table[i].level,pa,integer);
//储存到变量.
}
getsymdo;
}while(sym==comma);
}
//get out the loop
if(sym!=rparen)
//error
{
printerr(27);
//while(sym!=semicolon)
// {
// getsymdo;
// }
}
//跳过所有相关错误,直到句末.
else
{
getsymdo;
}
}
else if(sym==writesym)
{
// 字符串,表达式的处理..
getsymdo;
if(sym==lparen)
{//// 字符串在此处应该如何处理?
do
{
getsymdo;
/*if(sym!=stringsym)
printerr(29);
else
getsymdo;
i=position(id,*ptx);
if(i==0)
printerr(29);
else
switch(table[i].type)
{
case real:
if(strcmp(&(string_buffer[0]),"real")!=0)
printerr(29);
break;
case integer:
if(strcmp(&(string_buffer[0]),"integer")!=0)
printerr(29);
break;
case plchar:
if(strcmp(&(string_buffer[0]),"char")!=0)
printerr(29);
break;
default :
break;
}*/
memcpy(nextlev,fsys,sizeof(bool)*keynum);
nextlev[rparen]=true;
nextlev[comma]=true;//write的后跟符号为rparen ,comma
do_deal_expression(nextlev,ptx,lev);
//调用表达式的处理
pa.i=14;
do_genecode(opr,0,pa,integer);//生成输出
}while(sym==comma);
if(sym!=rparen)
{
printerr(29);
}
else
{
getsymdo;
}
pa.i=15;
do_genecode(opr,0,pa,integer);
}
else
{
printerr(29);
// while(sym!=semicolon)
// {
// getsymdo;
// }
}
}
else if(sym==ifsym)
{
getsymdo;
memcpy(nextlev,fsys,sizeof(bool)*keynum);
nextlev[thensym]=true;
nextlev[elsesym]=true;
// nextlev[dosym]=true;
do_deal_condition(nextlev,ptx,lev);
//调用条件处理函数处理
if(sym==thensym)
{
//get if there a then
getsymdo;
//get the action;
}
else
{
printerr(10);
}
///VIP
//对跳转语句的处理
cx1=cx;// save the cx
pa.i=0;
do_genecode(jpc,0,pa,integer);
//生成跳转
//处理then后的语句.
//递归调用
deal_statement(fsys,ptx,lev);
code[cx1].a=cx;//
//cx恰好是then后语句处理结束之后的位置
//如果前面的条件不满足,则就应该跳转到此处.
//getsymdo;
if(sym==elsesym)
{
cx1=cx;
getsymdo;
pa.i=0;
do_genecode(jpc,0,pa,integer);
deal_statement(fsys,ptx,lev);
code[cx1].a=cx;
}
}
else if(sym==beginsym)
//为复合语句
{
getsymdo;
memcpy(nextlev,fsys,sizeof(bool)*keynum);
nextlev[semicolon]=true;
nextlev[endsym]=true;
//递归调用
do_deal_statement(nextlev,ptx,lev);
while(sym==semicolon||(in_set(sym,statement_firstset)))// 多重
{
///vip
//vip
if(sym==semicolon)
{
getsymdo;
}
else
{
printerr(0);
}//lose the semicolon
if(sym==endsym)
{
break;
}
do_deal_statement(nextlev,ptx,lev);
}
if(sym==endsym)
{
//to the end
getsymdo;
}
else
{
printerr(13);
//printf("the programme has gone to here\n");
}
}
//循环语句的处理
else if(sym==forsym)
{
//cx1=cx;//keep the record.
getsymdo;
if(sym!=ident)
{
///
printerr(40);
}
i=position(id,*ptx);
if(i==0)
{
printerr(25);
}
getsymdo;
if(sym!=assign)
{
printerr(41);//no :=
}
getsymdo;
do_deal_expression(nextlev,ptx,lev);//处理赋值
pa.i=table[i].adr;
do_genecode(sto,lev-table[i].level,pa,integer);
//cx1=cx;
if(sym!=tosym && sym!=downtosym)
{
printerr(12);
}
if(sym==tosym)
add_flag=1;
else
add_flag=-1;
getsymdo;
do_deal_expression(nextlev,ptx,lev);
if(sym!=dosym)
{
printerr(42);
}//无do
getsymdo;
deal_statement(nextlev,ptx,lev);
pa.i=0;
do_genecode(jpc,0,pa,integer);
}
//case of
else if(sym==casesym)
{
getsymdo;
//genecode
do_deal_expression(fsys,ptx,lev);
pa.i=table[i].adr;
do_genecode(lit,lev-table[i].level,pa,integer);
if(sym!=ofsym)
printerr(43);
else
do
{
getsymdo;
/*i=position(id,*ptx);
if(i==0)
printerr(25);
else
getsymdo;
//genecode*/
if(sym==integersym)
{
pa.i=num;
do_genecode(lit,0,pa,integer);
}
else if(sym==realsym)
{
pa.d=fnum;
do_genecode(lit,0,pa,real);
}
else if(sym==charsym)
{
pa.c=char_buffer;
do_genecode(lit,0,pa,plchar);
}
getsymdo;
//read the :
if(sym!=colon)
printerr(44);
pa.i=18;
do_genecode(opr,0,pa,integer);
//opr 18 是针对case语句而设的比较指令.
//jpc
getsymdo;
deal_statement(fsys,ptx,lev);
//printf("%s\n",id);
cx1=cx;
pa.i=0;
do_genecode(jpc,0,pa,integer);
pa.i=0;
do_genecode(jmp,0,pa,integer);
case_jmp[case_flag1++]=cx;
code[cx1].a=cx;
}while(sym==semicolon);
for(i=0;i<case_flag1;i++)
code[i].a=case_jmp[i];
if(sym!=endsym)
printerr(45);
else
getsymdo;
}
return 0;
}
int deal_expression(bool *fsys,int *ptx,int lev)
{
enum symbolset pmbuffer;
/*
use it to buffer the plus or the minus
*/
bool nextlev[keynum];
//a hash table
if(sym==plus||sym==minus)
{
pmbuffer=sym;
getsymdo;
memcpy(nextlev,fsys,sizeof(bool)*keynum);
nextlev[plus]=true;//正号;
nextlev[minus]=true;//负号,注意对其的处理,前面对正负的处理可能与后有冲突.
//接下来是对项的处理,调用deal_term,其后应有一函数调用:getsymdo
do_deal_term(nextlev,ptx,lev);
if(pmbuffer==minus)
{
pa.i=1;
do_genecode(opr,0,pa,integer);//make the number minus生成取反指令
}
}
else//如果不是负号,则直接进入项处理
{
memcpy(nextlev,fsys,sizeof(bool)*keynum);
nextlev[plus]=true;
nextlev[minus]=true;
//无符号时直接处理项
do_deal_term(nextlev,ptx,lev);
}
while(sym==plus||sym==minus)
//自入项的循环处理
{
pmbuffer=sym;
getsymdo;
memcpy(nextlev,fsys,sizeof(bool)*keynum);
nextlev[plus]=true;
nextlev[minus]=true;
do_deal_term(nextlev,fsys,sizeof(bool)*keynum);
if(pmbuffer==plus)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -