📄 ci.txt
字号:
error(30); //数太大
num=0;
}
gen(lit,0,num);
getsym();
}
else if(sym=="lparen")
{
getsym();
expression(fsys+"rparen");
if(sym=="rparen")
getsym();
else error(22); //漏右括号
}
test(fsys,aaa+"lparen",23);//error因子后不能为此符号
}
} //{因子处理子程序
void yy::term(symset fsys){
string mulop;
//{项处理子程序开始} //消去左递归
factor(fsys+"times"+"slash");
while(sym=="times"||sym=="slash")
{
mulop=sym;
getsym();
factor(fsys+"times"+"slash");
if(mulop=="times") gen(opr,0,4);
else gen(opr,0,5);
}
} // {项处理子程序}
void yy::expression(symset fsys){
string addop;
//{表达式处理子程序开始)
term(fsys);
while(sym=="plus"||sym=="minus")
{
addop=sym;
getsym();
term(fsys+"plus"+"minus");
if(addop=="plus") gen(opr,0,2);
else gen(opr,0,3);
}
} //{表达式处理子程序}
void yy::condition(symset fsys){
string relop ;
expression(fsys+"eql"+"neq"+"lss"+"gtr"+"leq"+"geq");
if(!(incl(aaa+"eql"+"neq"+"lss"+"gtr"+"leq"+"geq"))) error(20); //应为关系运算符
else{
relop=sym;
getsym();
expression(fsys);
if(relop=="eql")gen(opr,0,8);
else if(relop=="neq")gen(opr,0,9);
else if(relop=="lss")gen(opr,0,10);
else if(relop=="gtr")gen(opr,0,12);
else if(relop=="leq")gen(opr,0,13);
else if(relop=="geq")gen(opr,0,11);
}
} // {条件表达式处理子程序开始}
void yy::statement(symset fsys){
//{语句处理子程序}fsys:symset
int i,cx1,cx2;//{语句处理子程序开始}
if(sym=="ident")
{ // {赋值语句处理}
i=position(id);
if(i==0) error(11); //标识符未说明
else if(table[i].kind!=variable)
{
error(12); // {对常量赋值}
i=0;
}
getsym();
if(sym=="becomes") getsym();
else error(13) ; //应为=
expression(fsys);
if(i!=0)
{
gen(sto,lev-table[i].vv.vari.level,table[i].vv.vari.dr);
}
}else if(sym=="scanf")
{ // {读语句处理}
getsym();
if(sym!="lparen") error(34); //漏左括号
else do
{
getsym();
if(sym=="ident")
i=position(id);
else i=0;
if(i==0) error(35); // read或write语句中缺"("
else{
gen(opr,0,16);
gen(sto,lev-table[i].vv.vari.level,table[i].vv.vari.dr) ;
}
getsym();
}while(sym=="comma");
if(sym!="rparen")
{
error(33); //嵌套深度超过允许值
while(!(incl(fsys))) getsym();
}else getsym();
}else if(sym=="printfsym")
{ //{写语句处理}
getsym();
if(sym=="lparen")
{
do{
getsym();
if(sym=="upcomma")
{
getsym();
if(sym=="ident") i=position(id);
else i=0;
if(i==0) error(11); // 标识符未说明
else chwr[wx]=id;
wx=wx+1;
getsym();
if(sym=="upcomma") getsym();
else error(36); // write语句中需打印的标识符未加单引号
getsym();
expression(fsys+"rparen"+"comma");
gen(opr,0,14);
}else
{
getsym();
expression(fsys+"rparen"+"comma");
gen(opr,0,14);
}
}while(sym=="comma");
if(sym!="rparen") error(33); //read或write语句中缺")"
else getsym();
}
gen(opr,0,15);
}else if(sym=="ifsym")
{ //{条件语句处理}
getsym();
if(sym!="lparen") error(34);//漏左括号
getsym();
condition(fsys+"elsesym"+"dosym");
if(sym!="rparen") error(33); //漏右括号
else getsym();
if(sym=="elsesym") getsym();
else error(16); //应为else
cx1=cx;gen(jpc,0,0);
statement(fsys);
code[cx1].a=cx;
}else if(sym=="beginsym")
{ //{复合语句处理)
getsym();
statement(fsys+"elsesym"+"semicolon") ;
while(incl(statbegsys+"semicolon"))
{
if(sym=="semicolon") getsym();
else error(10); //句子间没封号
statement(fsys+"semicolon"+"endsym");
}
if(sym=="endsym") getsym();
else error(17); //为}
}else if(sym=="whilesym")
{ //{循环语句处理}
cx1=cx;
getsym();
if(sym!="lparen") error(34);//漏左括号
else getsym();
condition(fsys+"dosym");
cx2=cx;
gen(jpc,0,0);
if(sym!="rparen")
{
error(33); //漏有括号
while(!(incl(fsys))) getsym();
}else getsym();
if(sym=="dosym") getsym();
else error(18);//应为'do'
statement(fsys);
gen(jmp,0,cx1);
code[cx2].a=cx;
test(fsys,bbb,19);
}//{语句处理子程序结束
} //{语句处理子程序}
void yy::block(int lev,int tx,symset fsys){
//{分程序处理模块}
int tx0; //{起始标识符的下标}
dx=3; tx0=tx;
table[tx].vv.vari.dr=cx;
gen(jmp,0,0);
if(lev>levmax) error(32);// 嵌套深度超过允许值
do
{
if(sym=="constsym")
{ //{常量说明部分处理}
getsym();
do{
constdeclaration();
while(sym=="comma"){
getsym();
constdeclaration();
}
if(sym=="semicolon") getsym();
else error(5);//: 漏掉逗号或分号
}while(sym=="ident");
} //{常量说明部分处理结束}
if(sym=="intsym") //{变量说明部分处理}
{
getsym();
do{
vardeclaration();
while(sym=="comma")
{
getsym();
vardeclaration();
}
if(sym=="semicolon")getsym();
else{
error(5) ;//5: 漏掉逗号或分号
getsym();
}
}while(sym=="ident");// {变量说明部分处理结束)
}
test(statbegsys+"ident",declbegsys,7);
}while(incl(declbegsys));
code[table[tx0].vv.vari.dr].a=cx;
table[tx0].vv.vari.dr=cx; //{代码开始地址}
cx0=cx;
gen(int1,0,dx);
statement(fsys+"semicolon"+"endsym");
gen(opr,0,0); //{返回}
test(fsys,bbb,8);
listcode();
} //{分程序处理模块}
int yy::base(int l){
int b1;
b1=b; //{顺静态链求层差为1的基地址}
while(l>0){
b1=s[b1] ;
l=l-1;}
return b1;
}
void yy::interpret(){
int p,t;//{p:程序地址寄存器, b:基地址寄存器, t:栈顶地址寄存器}
instruction i; //{指令寄存器}
//int s[stacksize];//{数据存储}
fout<<"start PL/0'" ;
t=0;b=1;p=0;wx=1;
s[1]=0;s[2]=0;s[3]=0;
do{
i=code[p];p=p+1;
switch(i.f){
case lit:t=t+1;s[t]=i.a;
break;
case opr:{
switch(i.a){
case 0:t=b-1;p=s[t+3];b=s[t+2];
break;//{返回}
case 1:s[t]=-s[t];
break;
case 2:t=t-1;s[t]=s[t]+s[t+1];
break;
case 3:t=t-1;s[t]=s[t]-s[t+1];
break;
case 4:t=t-1;s[t]=s[t]*s[t+1];
break;
case 5:t=t-1;s[t]=s[t]/s[t+1];
break;
case 6:{
if(s[t]%2==1)s[t]=1;
else s[t]=0;
}
break;
case 8:t=t-1;s[t]=int(s[t]==s[t+1]);
break;
case 9:t=t-1;s[t]=int(s[t]!=s[t+1]);
break;
case 10:t=t-1;s[t]=int(s[t]<s[t+1]);
break;
case 11:t=t-1;s[t]=int(s[t]>=s[t+1]);
break;
case 12:t=t-1;s[t]=int(s[t]>s[t+1]);
break;
case 13:t=t-1;s[t]=int(s[t]<=s[t+1]);
break;
case 14://fout<<chwr[wx];
fout<<s[t] ;
t=t-1;wx=wx+1;
break;
case 15://writeln(fw2);
break;
case 16:t=t+1;fi>>s[t];
break;
}
}break;
case lod: t=t+1;s[t]=s[base(1)+i.a];
break;
case sto:s[base(1)+i.a]=s[t];
t=t-1;
break;
case cal://{generte new block mark}
s[t+1]=base(1);
s[t+2]=b;
s[t+3]=p;
b=t+1;
p=i.a;
break;
case int1:t=t+i.a;
break;
case jmp:p=i.a;
break;
case jpc:if(s[t]==0) p=i.a;
t=t-1;
break;
} //{with,case }
}while(p!=0);
fout<<"end PL/0";
} // {执行目录代码子程序}
yy::yy(){
fin.open("ff.txt",ios::in);
fi.open("fi.txt",ios::in);
fout.open("fw.txt",ios::out);
word[1]="const"; word[2]="do" ;
word[3]="else" ; word[4]="if" ;
word[5]="int" ; word[6]="main";
word[7]="printf"; word[8]="scanf" ;
word[9]="while" ;
wsym[1]="constsym"; wsym[2]="dosym";
wsym[3]="elsesym"; wsym[4]="ifsym";
wsym[5]="intsym"; wsym[6]="mainsym";
wsym[7]="printfsym"; wsym[8]="scanfsym";
wsym[9]="whilesym";
mnemonic[0]="lit" ; mnemonic[1]="opr" ;
mnemonic[2]="lod" ; mnemonic[3]="sto" ;
mnemonic[4]="cal"; mnemonic[5]="int" ;
mnemonic[6]="jmp"; mnemonic[7]="jpc" ;
declbegsys=declbegsys+"constsym"+"intsym";
statbegsys=statbegsys+"beginsym"+"callsym"+"ifsym"+"whilesym";
facbegsys=facbegsys+"ident"+"number"+"lparen";
err=0;cw=1;wx=1;
tx=0;
cc=0;cx=0;ll=0;ch=' ';kk=a1;getsym();
if(sym!="mainsym")error(66);//cheng xu yi main kai tou
else getsym();
if(sym!="lparen") error(34);//lou zuo kuo hao
else getsym();
if(sym!="rparen") error(34);//lou you kuo hao
else getsym();
if(sym!="beginsym") error(344);
else getsym();
block(0,0,declbegsys+statbegsys+"endsym");//();
if(sym!="endsym") error(9); //jie su fu }
if(err==0) interpret() ;
else fout<<"error in PL/0 program";
fin.close();
fi.close();
fout.close();
}
void main(){
yy ji060227;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -