?? 新建 文本文檔.txt
字號:
/**********************SAMPLE語言的語法、語義分析器******************************/
#include<iostream.h>
#include<string.h>
#include <stdio.h>
char word[60][20]; //用來存放初使符號表
int n; //用來表示table1的元素個數(shù)
int q; //用來表示數(shù)組c的元素個數(shù)
char table1[100][20]; //表里存放標(biāo)識符,整數(shù),字符常數(shù)
int c[500]; //表里存放詞法分析結(jié)果
int tetrad_num=0; //記錄四元式個數(shù)
int token_num=0; //對token的內(nèi)容記數(shù)
int token=0;
int table1_num=0; //
int table1_num2=0;
char stack[100][20];
int stack_num=0;
int flag=0;
typedef struct //四元組類說明
{
char opr[20];
char p1[20];
char p2[20];
char p3[20];
}sys;
sys tetrad[500]; //四元組
void tet(char a1[],char a2[],char a3[],char a4[]); //四元組賦值
void init();
int IsDigit(char ch); //數(shù)字?
int IsAlpha(char ch); //字母?
void getsym(FILE *fin); //詞法分析
int getnext();
void putout(); //輸出四元組
//以下為各產(chǎn)生式對應(yīng)程序
//以下是程序
void program();
void id(int &token);
void var_explain(int &token);
void var_definition(int &token);
void mid_var(int &token);
void kind(int &token);
void id_table(int &token);
void mid_id(int &token);
//以下是表達(dá)式
void expression(int &token);
void a_expression(int &token);
void mid_a1(int &token);
void a_1(int &token);
void mid_a2(int &token);
void a_2(int &token);
void a_3(int &token);
void interger(int &token);
void b_expression(int &token);
void mid_b1(int &token);
void b_1(int &token);
void mid_b2(int &token);
void b_2(int &token);
void b_3(int &token);
void bool_digit(int &token);
void relation(int &token);
void mid(int &token);
//以下是語句
/*void sentence(int &token);
void complex(int &token);
void sentence_table(int &token);
void mid_sentence(int token);*/
void main()
{
cout<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
<<"* 姓名 薛江 *\n"
<<"* 班級 05計算機聯(lián)合班 *\n"
<<"* 學(xué)號 200530612154 *\n"
<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n";
while(1)
{
cout<<"請輸入要測試的程序:";
char filename[10];
cin>>filename;
FILE* fin = fopen(filename,"r");
getsym(fin);
cout<<endl;
expression(token);
cout<<table1[0]<<table1[1]<<table1[2]<<table1[3]<<table1[4]<<table1[5]<<table1[6]<<table1[7]<<endl;
cout<<stack[0]<<stack[1]<<stack[2]<<stack[3]<<stack[4]<<stack[5]<<stack[6]<<stack[7]<<endl;
putout();
fclose(fin);
}
}
//以下是程序
void program()
{
token=getnext();
if(token==23)
{
token=getnext();
id(token);
if(token==52)
{
tet("program",table1[table1_num++],"-","-");
token=getnext();
var_explain(token);
//complex(token);
if(token==46)
{
tet("sys","-","-","-");
}
else
{
cout<<"error1"<<endl;
}
}
else
{
cout<<"error2"<<endl;
}
}
else
{
cout<<"error3"<<endl;
}
}
void id(int &token)
{
if(token==36)
{
token=getnext();
}
else
{
cout<<"error4"<<endl;
}
}
void var_explain(int &token)
{
if(token==33)
{
token=getnext();
var_definition(token);
}
else if(token!=3)
{
cout<<"error5"<<endl;
}
}
void var_definition(int &token)
{
id_table(token);
if(token==50)
{
token=getnext();
kind(token);
if(token==52)
{
token=getnext();
}
else
{
cout<<"error6"<<endl;
}
mid_var(token);
}
else
{
cout<<"error7"<<endl;
}
}
void mid_var(int &token)
{
var_definition(token);
if(token!=3)
{
cout<<"error8"<<endl;
}
}
void kind(int &token)
{
if(token==17||token==4||token==25)
{
token=getnext();
}
else
{
cout<<"error9"<<endl;
}
}
void id_table(int &token)
{
id(token);
mid_id(token);
}
void mid_id(int &token)
{
if(token==44)
{
token=getnext();
id_table(token);
}
else if(token!=3)
{
cout<<"error10"<<endl;
}
}
//以下是語句
/*void complex(int &token)
{
if(token==3)
{
token=getnext();
sentence_table(token);
if(token==12)
{
token=getnext();
}
else
{
cout<<"error"<<endl;
}
}
else
{
cout<<"error"<<endl;
}
}
void sentence_table(int &token)
{
sentence(token);
mid_sentence(token);
}
void mid_sentence(int token)
{
int schain=statstack[--top1],p,q;
//backpatch(sentence.chain,nextstat)
p=q=schain;
while(p!=0)
{
q=sen[p].next;
sen[p].next=nextstat;
p=q;
}
if(token==52)
{
token=getnext();
sentence(token);
}
else if(token!=12)
{
cout<<"error"<<endl;
}
}
void Sentence()
{
if(!strcmp(token,"while"))
{
//while 語句
//w.codebegin入棧
statstack[top1++]=nextstat;
gettoken();
SBoolExp();//statstack棧頂為E.false,E.true,E.codebegin
if(!strcmp(token,"do"))
{
int f,t,cb,wcb,p,q;
f=statstack[--top1];//E.false
t=statstack[--top1];//E.true
cb=statstack[--top1];//E.codebegin
wcb=statstack[--top1];//get w.codebegin
//backpatch(E.true,nextstat)
p=q=t;
while(p!=0)
{
q=sen[p].next;
sen[p].next=nextstat;
p=q;
}
//w.codebegin入棧
statstack[top1++]=wcb;
//w1.codebegin=w.codebegin(w1為whlie E do)
statstack[top1++]=wcb;
//w1.chain=E.false
statstack[top1++]=f;
gettoken();
Sentence();
//backpatch(s.chain,w1.codebegin)
int schain=statstack[--top1];//得到do后面的sentence的chain
int wchain=statstack[--top1];//得到w1.chain
wcb=statstack[--top1];//得到w1.codebegin
cb=statstack[--top1];//得到w.codebegin
p=q=schain;
while(p!=0)
{
q=sen[p].next;
sen[p].next=wcb;
p=q;
}
//emit(j,-,-,w.codebegin)
strcpy(sen[nextstat].op,"j");
strcpy(sen[nextstat].oprand1,"-");
strcpy(sen[nextstat].oprand2,"-");
sen[nextstat++].next=cb;
//s.chain=w1.chain
statstack[top1++]=wchain;
}
else
cout<<"ERROR3: MISSING DO AFTER WHILE\n";
}
else if(!strcmp(token,"repeat"))
{
//repeat語句
//repeat.codebegin=nextstat
statstack[top1++]=nextstat;
gettoken();
Sentence();
if(!strcmp(token,"until"))
{
//backpatch(S1.chain,nextstat)
int s1chain,p,q;
s1chain=statstack[--top1]; //得到S1.chain
p=q=s1chain;
while(p!=0)
{
q=sen[p].next;
sen[p].next=nextstat;
p=q;
}
gettoken();
SBoolExp();
//backpatch(E.false,repeat.codebegin)
int f,t,cb;
f=statstack[--top1];t=statstack[--top1];
--top1;cb=statstack[--top1];//get repeat.codebegin
p=q=f;
while(p!=0)
{
q=sen[p].next;
sen[p].next=cb;
p=q;
}
statstack[top1++]=t;
}
else
cout<<"ERROR4: MISSING UNTIL AFTER REPEAT\n";
}
else if(!strcmp(token,"if"))
{
//if then 語句
gettoken();
SBoolExp();
if(!strcmp(token,"then"))
{
//backpatch(E.true,nextstat)
int f,t,cb,p,q;
f=statstack[--top1];//E.false
t=statstack[--top1];//E.true
cb=statstack[--top1];//E.codebegin
p=q=t;
while(p!=0)
{
q=sen[p].next;
sen[p].next=nextstat;
p=q;
}
gettoken();
Sentence();
//-〉modify //C.chain=E.false(C.chain=if E then)
statstack[top1++]=f;
//if then else 語句
SenElse();
}
else
cout<<"ERROR5: MISSIG THEN AFTER IF\n";
}
else if(!strcmp(token,"begin"))
{
SComSen();
}
else if(token[0]>='a'&&token[0]<='z'||token[0]>='A'&&token[0]<='Z')//改為36,標(biāo)示符
{
SIdent();
if(!strcmp(token,":="))
{
//賦值語句
gettoken();
SArithExp();
strcpy(sen[nextstat].op,":=");
strcpy(sen[nextstat].oprand1,idstack[--idtop]);
strcpy(sen[nextstat].oprand2,"-");
strcpy(sen[nextstat].result, idstack[--idtop]);
sen[nextstat++].next=-1;
//s.chain=0
statstack[top1++]=0;
}
else
cout<<"ERROR6: MISSING := AFTER IDENTIFIER\n";
}
else cout<<"ERROR7\n";
}
void SenElse()
{
int s1chain,cchain;
cchain=statstack[--top1]; //get C.chain
s1chain=statstack[--top1];//get Sen1.chain
if(!strcmp(token,"else"))
{
//q:=nextstat
int q=nextstat;
//emit(j,-,-,0)
strcpy(sen[nextstat].op,"j");
strcpy(sen[nextstat].oprand1,"-");
strcpy(sen[nextstat].oprand2,"-");
sen[nextstat++].next=0;
//backpatch(c.chain,nextstat)
int r,s;
r=s=cchain;
while(r!=0)
{
s=sen[r].next;
sen[r].next=nextstat;
r=s;
}
//seneles.chain=merge(sen1.chain,q)
if(q==0)
statstack[top1++]=s1chain;
else
{
sen[1].next=s1chain;
statstack[top1++]=q;
}
gettoken();
Sentence();
//Sen.chain=merge(SenElse.chain,Sen_2.chain)
int s2chain,selsechain;
s2chain=statstack[--top1];
selsechain=statstack[--top1];
if(s2chain==0)
statstack[top1++]=s2chain;
else
{
sen[s2chain].next=selsechain;
statstack[top1++]=s2chain;
}
}
else if(strcmp(token,"end")&&strcmp(token,";"))
cout<<"ERROR8\n";
else
{
//空產(chǎn)生式
//merge(C.chain,S1.chain)
if(s1chain==0)
statstack[top1++]=cchain;
else
{
sen[s1chain].next=cchain;
statstack[top1++]=s1chain;
}
}
}
*/
//以下是表達(dá)式
void expression(int &token)
{
token=getnext();
a_expression(token);
b_expression(token);
//c_expression(token);
}
void a_expression(int &token)
{
a_1(token);
mid_a1(token);
}
void mid_a1(int &token)
{
if(token==43)
{
token=getnext();
a_1(token);
mid_a1(token);
tet("+",stack[stack_num-2],stack[stack_num-1],"T");
}
else if(token==45)
{
token=getnext();
a_1(token);
mid_a1(token);
tet("-",stack[stack_num-2],stack[stack_num-1],"T");
}
else if(token!=40||token!=20||token!=1||
token!=56||token!=53||token!=55||
token!=54||token!=58||token!=57||
token!=52||token!=11||token!=32||
token!=12||token!=10||token!=29)
{
cout<<"error11"<<endl;
}
}
void a_1(int &token)
{
a_2(token);
mid_a2(token);
}
void mid_a2(int &token)
{
if(token==41)
{
token=getnext();
a_2(token);
mid_a2(token);
tet("*",stack[stack_num-2],stack[stack_num-1],"T");
}
else if(token==48)
{
token=getnext();
a_2(token);
mid_a2(token);
tet("/",stack[stack_num-2],stack[stack_num-1],"T");
}
else if(token!=43||token!=45||token!=40||
token!=56||token!=1||token!=20||
token!=53||token!=54||token!=55||
token!=57||token!=58||token!=52||
token!=11||token!=32||token!=12||
token!=10||token!=29)
{
cout<<"error12"<<endl;
}
}
void a_2(int &token)
{
if(token==45)
{
token=getnext();
a_2(token);
}
else if(token==36||token==37||token==39)
{
a_3(token);
}
else
{
cout<<"error"<<endl;
}
}
void a_3(int &token)
{
if(token==39)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -