?? pl0語(yǔ)法分析器遞歸子程序法.c
字號(hào):
}
if(token=='k')//條件語(yǔ)句
{
token=word();
T();
if(token!='o')
{
error(16);//條件語(yǔ)句缺少"then"報(bào)錯(cuò)不作處理
}
if(token=='e'||token=='k'||token=='q'||token=='g'||token=='n'||token=='r'||token=='f'||token!='.'||token!=';'||token!='j')
Y();//這樣處理是因?yàn)榭赡軇倓傄呀?jīng)取到了語(yǔ)句的開始符號(hào)
else
{
token=word();
Y();
}
}
if(token=='q')//當(dāng)型循環(huán)
{
token=word();//putchar('y');
T();//putchar('y');
if(token!='i')
{
error(18);//putchar('y');//當(dāng)型循環(huán)語(yǔ)句缺少"do"報(bào)錯(cuò)不作處理
//putchar(token);
if(token=='e'||token=='k'||token=='q'||token=='g'||token=='n'||token=='r'||token=='f'||token!='.'||token!=';'||token!='j')
{
//putchar(token);
Y();//這樣處理是因?yàn)榭赡軇倓傄呀?jīng)取到了語(yǔ)句的開始符號(hào)
}
else
{
//putchar(token);
token=word();//putchar('y');
Y();//putchar('y');
}
}
else
{
token=word();
Y();
}
}
if(token=='g')//過程調(diào)用語(yǔ)句
{
ytemprow=0;
ytemprow=row;
token=word();
if(token!='e')
{
error(14);//過程調(diào)用語(yǔ)句后面應(yīng)該是標(biāo)志符
while(ytemprow==row)
token=word();//除去同一行的多余字符
Y();//token=word();
}
else
{
compare(tempword,'m');
token=word();//putchar(token);putchar('y'); //在此還需要判斷標(biāo)志符是否具有過程屬性,查表
}
}
if(token=='n')//讀語(yǔ)句
{
ytemprow=0;
ytemprow=row;
token=word(); //putchar('x');
if(token!='(')
{
error(34);//讀語(yǔ)句缺少左括號(hào),判斷是否是標(biāo)志符
while(ytemprow==row)
token=word();
//token=word();
ytemprow=0;//putchar(token);
Y();//調(diào)用語(yǔ)句處理函數(shù)是因?yàn)檫@是讀語(yǔ)句出錯(cuò)也就是在語(yǔ)句處理中,它的前面的函數(shù)S,F,B,G均不會(huì)出現(xiàn)在讀語(yǔ)句之后
}
else
{
token=word();
if(token!='e')
{
error(36);//read語(yǔ)句括號(hào)中缺少標(biāo)志符,//
while(ytemprow==row)
token=word();
Y();
ytemprow=0;//在此檢查后跟符是否為括號(hào),
}
else
{ //read語(yǔ)句括號(hào)中的標(biāo)志符不是變量
compare(tempword,'p');//檢查屬性
token=word();
if(token!=')')//判斷是否是同行
{
while(token!=')'&&ytemprow==row)//檢查行是否結(jié)束
{
//contr++;//用作控制循環(huán),改成判斷是否是同行
if(token!=',')
{
error(5);//變量之間應(yīng)該用逗號(hào)分隔
while(ytemprow==row)
token=word();
Y();
ytemprow=0;//putchar('x');
}
else
{
token=word();
if(token!='e')
{
error(36); //判斷同行是否是結(jié)束,是就報(bào)錯(cuò)結(jié)束符是右括號(hào)
while(ytemprow==row)
token=word();
Y();
ytemprow=0;//putchar('x');
}
else
{
compare(tempword,'p');
token=word();
}
//if(contr>20)//缺少右括號(hào)//改成判斷是否是同行
//{
// error(1);
// break;
} //}
}//while
if(token!=')')
{
error(22);
token=word();
}
else
{
token=word();
}
}
else
token=word();
}//else
}
}
if(token=='r')//寫語(yǔ)句//處理方式與讀語(yǔ)句一致
{
ytemprow=0;
ytemprow=row;
token=word();
if(token!='(')
{
error(39);
while(ytemprow==row)
token=word();
//token=word();
ytemprow=0;
Y();
}
else
{
token=word();//int contr=0;
if(token!='e'&&token!='d'&&token!='(')
{
error(38);
while(ytemprow==row)
token=word();
//token=word();
ytemprow=0;Y();
}
else
{
//compare(tempword,'p');
A();
//token=word();
if(token!=')')
{
while(token!=')'&&ytemprow==row)
{
if(token!=',')
{
error(5);
while(ytemprow==row)
token=word();
ytemprow=0;Y();
}
else
{
token=word();
if(token!='e'&&token!='d'&&token!='(')
{
error(38);
while(ytemprow==row)
token=word();
//putchar(token);
ytemprow=0;Y();
}
else
{
//compare(tempword,'p');
A();
//token=word();
}
}
} //while
if(token!=')')
{
error(22);//缺少右括號(hào)
token=word();
}
else
{
token=word();
}
}
else
{
token=word();//結(jié)束后再取下一個(gè)字符
}
}
}
}
if(token=='f')//復(fù)合語(yǔ)句
{
token=word();//putchar('y');
Y();
if(token!='j'&&token!=';')//判斷是正確還是錯(cuò)誤
{
error(17);//putchar('x');
}
else
{
while(token!='j')
{
if(token!=';')
{
//putchar('x');
error(10);//putchar('y');putchar(token);putchar('x');//缺少分號(hào)
if(token=='e'||token=='k'||token=='q'||token=='g'||token=='n'||token=='r'||token=='f'||token!='.'||token!=';'||token!='j')
Y();
else
{
token=word();
if(token=='e'||token=='k'||token=='q'||token=='g'||token=='n'||token=='r'||token=='f'||token!='.'||token!=';'||token!='j')
Y();
}
}
token=word();
Y();
}//while
if(token!='j')
{
error(17);//putchar('x');//缺少end
}
else
{
token=word();
}
}
}
if(token=='.')
{
if(word()!=NULL)
{
error(46);//程序意外結(jié)束,無(wú)法繼續(xù)編譯
exit(0);
}
}
}
}
void C()//過程首部
{
int gtemprow=0;
gtemprow=row;
if(token!='m')
{
error(1);//過程說(shuō)明符應(yīng)該為procedure
while(gtemprow==row)
token=word();
F();
}
else
{
token=word();//putchar('y');
if(token!='e')
{
error(4);//應(yīng)該接標(biāo)志符
while(gtemprow==row)
token=word();
F();
}
else
{
if(find(tempword))
{
error(43);//標(biāo)志符已定義
//putchar('x');
}
else
{
filltable(tempword,'m');//putchar('c');
}
token=word();
if(token!=';')
{
error(17);//結(jié)束符應(yīng)該為分號(hào)
}
else
{
token=word();
}
}
}
}
void A()//表達(dá)式
{
int atemprow=0;
atemprow=row;
if(token=='+'||token=='-')
{
token=word();//如果開始字符是‘+’或‘-’則取下一個(gè)字符
}
//putchar(token);
N();//putchar(token);
while(atemprow==row&&(token=='+'||token=='-'))//并且是同行
{
token=word();
N();
}
}
void N()//項(xiàng)
{
int ntemprow=0;
ntemprow=row;
if(token!='e'&&token!='d'&&token!='(')
{
error(7);
while(ntemprow==row&&token!='+'&&token!='-'&&token!=','&&token!='i'&&token!='o')
token=word();//將整個(gè)項(xiàng)去掉
}
else
{
I();
while(token=='*'||token=='/')
{
token=word();
I();
}
}
}
void I()//因子
{
int itemprow=0;
itemprow=row;
if(token!='e'&&token!='d'&&token!='(')
{
error(7);//開始符出錯(cuò)
while(itemprow==row&&token!='+'&&token!='-'&&token!=','&&token!='i'&&token!='o'&&token!='*'&&token!='/')
token=word();
}
else
{
if(token=='e')
{
compare(tempword,'p');
token=word();
}
if(token=='d')
token=word();
if(token=='(')
{
token=word();
A();
if(token!=')')
{
error(22);//缺少右括號(hào)
}
else
{
token=word();
}
}
}
}
void X()//關(guān)系運(yùn)算符
{
if(token!='#'&&token!='<'&&token!='>'&&token!='b'&&token!='c')
{
error(40);//關(guān)系運(yùn)算符出錯(cuò)
if(token!='+'&&token!='-'&&token!='e'&&token!='d'&&token!='(')//防止已經(jīng)取得了下一個(gè)標(biāo)志符的開始符
token=word();
}
else
{
token=word();
}
}
void T()//條件
{
int ttemprow=0;
ttemprow=row;
if(token!='+'&&token!='-'&&token!='e'&&token!='d'&&token!='('&&token!='l')
{
error(41);//條件開始子集錯(cuò)誤
while(token!='i'&&token!='o')
{
token=word();
if(ttemprow!=row)
break;
}
}
else
{
if(token=='l')
{
A();
}
else
{//putchar('y');putchar(token);
A();//putchar('y');
X();//putchar('y');putchar(token);
A();
}
}
}
void main()
{
op=fopen("b.c","r");
token=word();
S();
fclose(op);
getchar();
exit(0);
}
/*程序中有許多不足之處,請(qǐng)各位指教*/
/*程序在VC6.0下編譯通過*/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -