📄 2.cpp
字号:
/**********************SAMPLE语言的语法、语义分析器******************************/
#include<iostream.h>
#include<string.h>
#include <stdio.h>
char word[60][20]; //用来存放初使符号表
int n; //用来表示table1的元素个数
int q; //用来表示数组c的元素个数
char table1[100][20]; //表里存放标识符,整数,字符常数
int c[500]; //表里存放词法分析结果
int tetrad_num=0; //记录四元式个数
int token_num=0; //对token的内容记数
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); //数字?
int IsAlpha(char ch); //字母?
void getsym(FILE *fin); //词法分析
int getnext();
void putout(); //输出四元组
//以下为各产生式对应程序
//以下是程序
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);
//以下是表达式
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计算机联合班 *\n"
<<"* 学号 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)
{
if(token==52)
{
token=getnext();
sentence(token);
}
else if(token!=12)
{
cout<<"error"<<endl;
}
}
//以下是表达式
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");
stack_num=stack_num-2;
strcpy(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");
stack_num=stack_num-2;
strcpy(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");
stack_num=stack_num-2;
strcpy(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");
stack_num=stack_num-2;
strcpy(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
{
a_3(token);
}
}
void a_3(int &token)
{
if(token==39)
{
token=getnext();
expression(token);
if(token==40)
{
token=getnext();
}
else
{
cout<<"error13"<<endl;
}
}
else if(token==36)
{
strcpy(stack[stack_num++],table1[table1_num2++]);
id(token);
}
else if(token==37)
{
strcpy(stack[stack_num++],table1[table1_num2++]);
interger(token);
}
else
{
cout<<"error14"<<endl;
}
}
void interger(int &token)
{
if(token==37)
{
token=getnext();
}
else
{
cout<<"error15"<<endl;
}
}
void b_expression(int &token)
{
b_1(token);
mid_b1(token);
}
void mid_b1(int &token)
{
if(token==20)
{
token=getnext();
b_1(token);
mid_b1(token);
}
else if(token!=40||token!=52||token!=29||token!=10||token!=12)
{
cout<<"error16"<<endl;
}
}
void b_1(int &token)
{
b_2(token);
mid_b2(token);
}
void mid_b2(int &token)
{
if(token==1)
{
token=getnext();
b_2(token);
mid_b2(token);
}
else if(token!=20||token!=40||token!=52||token!=29||token!=10||token!=12)
{
cout<<"error17"<<endl;
}
}
void b_2(int &token) ////////////////////////
{
if(token==18)
{
token=getnext();
b_2(token);
}
else
{
b_3(token);
}
}
void b_3(int &token) ///////////////////////////
{
if(token==39)
{
token=getnext();
b_expression(token);
if(token==40)
{
token=getnext();
}
else
{
cout<<"error18"<<endl;
}
}
else
{
a_expression(token);
mid(token);
}
}
void bool_digit(int &token)
{
if(token==13||token==31)
{
token=getnext();
}
else
{
cout<<"error19"<<endl;
}
}
void relation(int &token)
{
if(token==53)
{
flag=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -