www.pudn.com > myCompiler000.rar > compiler.cpp
#include "head.h"
WORD word[BUFLINE];//单词量不能大于256
stateStack _stack;//状态栈
int G_table[20][8];//文法矩阵
fourexp *fourexpHead;//生成四元式链的头指针
Vn vn_stack[STACKSIZE];//生成四元式时用的非终结符栈
int vn_stack_top = 0;//非终结符的栈顶
void add_fourexp(){//四元式前面的计算地址
int num = 0 ;
fourexp * i = fourexpHead ;
while( i ){
i->address = num ;
num++ ;
i = i->next;
}
i = fourexpHead;
while( i ){
if( i->isadd == true ){
i->temp = i->chain->address+1;
}
i = i->next;
}
}//地址计算
void pop_vn(int i){//出栈
vn_stack_top -= i;
}
void push_vn(Vn * vn_stack,Vn *s){//入栈
vn_stack[vn_stack_top] = *s;
vn_stack_top++;
}
void push(int n){//入栈
if(_stack.top==STACKSIZE) {cout<<"语法分析栈满!"<':
word[n].id = GREAT;
// word[n].type = 1;
strcpy(word[n].name,">");
n++;
break;
case '<':
word[n].id =LOW ;
// word[n].type = 1;
strcpy(word[n].name,"<");
n++;
break;
case '=':
if(buf[i-1] != ':'){
word[n].id = EQUAL;
// word[n].type = 1;
strcpy(word[n].name,"=");
n++;
}
break;
case '+':
word[n].id = PLUS;
// word[n].type = 1;
strcpy(word[n].name,"+");
n++;
break;
case '*':
word[n].id = MULTIPLY;
// word[n].type = 1;
strcpy(word[n].name,"*");
n++;
break;
case '(':
word[n].id = LEFT;
// word[n].type = 4;
strcpy(word[n].name,"(");
n++;
break;
case ')':
word[n].id = RIGHT;
// word[n].type = 4;
strcpy(word[n].name,")");
n++;
break;
default :
if(buf[i] == '#') goto lv;
cout<<"有非法字符";
exit(0);
}
i++;
}
}
lv:
strcpy(word[n].name,"#");
// word[n].type = 4;
word[n].id=ACC;
return n;//单词符号个数
}//词法分析
void G_init()//初始化文法矩阵
{
for(int i=0;i<20;i++)
for(int j=0;j<8;j++)
G_table[i][j]=-1;
G_table[0][0]=27;G_table[0][1]=23; //初始化文法表
G_table[1][0]=23;G_table[1][1]=0;G_table[1][2]=25;G_table[1][3]=1;G_table[1][4]=23;G_table[1][5]=2;G_table[1][6]=23;
G_table[2][0]=23;G_table[2][1]=0;G_table[2][2]=25;G_table[2][3]=1;G_table[2][4]=23;
G_table[3][0]=23;G_table[3][1]=3;G_table[3][2]=25;G_table[3][3]=4;G_table[3][4]=23;
G_table[4][0]=23;G_table[4][1]=5;G_table[4][2]=24;G_table[4][3]=6;
G_table[5][0]=23;G_table[5][1]=7;G_table[5][2]=8;G_table[5][3]=26;
G_table[6][0]=24;G_table[6][1]=23;G_table[6][2]=9;G_table[6][3]=24;
G_table[7][0]=24;G_table[7][1]=23;
G_table[8][0]=25;G_table[8][1]=25;G_table[8][2]=10;G_table[8][3]=25;
G_table[9][0]=25;G_table[9][1]=25;G_table[9][2]=11;G_table[9][3]=25;
G_table[10][0]=25;G_table[10][1]=7;G_table[10][2]=12;G_table[10][3]=7;
G_table[11][0]=25;G_table[11][1]=7;G_table[11][2]=13;G_table[11][3]=7;
G_table[12][0]=25;G_table[12][1]=7;G_table[12][2]=14;G_table[12][3]=7;
G_table[13][0]=25;G_table[13][1]=15;
G_table[14][0]=25;G_table[14][1]=16;
G_table[15][0]=26;G_table[15][1]=26;G_table[15][2]=17;G_table[15][3]=26;
G_table[16][0]=26;G_table[16][1]=26;G_table[16][2]=18;G_table[16][3]=26;
G_table[17][0]=26;G_table[17][1]=19;G_table[17][2]=26;G_table[17][3]=20;
G_table[18][0]=26;G_table[18][1]=7;
G_table[19][0]=26;G_table[19][1]=21;
}
void syntax(){//语法分析程序
/**文法
0 S'->S
1 S->if B then S else S
2 S->if B then S
3 S-> while B do S
4 S->begin L end
5 S->i:=E
6 L->S;L
7 L->S
8 B->B&B
9 B->B|B
10 B->i>i
11 B->ii=i
13 B->true
14 B->false
15 E->E+E
16 E->E*E
17 E->(E)
18 E->i
19 E->n
*/
int table[43][27]={//slr[1]分析表
{ 2 , WRD_ERR , WRD_ERR , 3 , WRD_ERR , 4 , WRD_ERR , 5 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 1 , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 99 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 7 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 8 , 9 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 6 , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 7 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 8 , 9 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 10 , WRD_ERR },
{ 2 , WRD_ERR , WRD_ERR , 3 , WRD_ERR , 4 , WRD_ERR , 5 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 12 , 11 , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 13 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , 14 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 15 , 16 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 17 , 18 , 19 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , -13 , WRD_ERR , WRD_ERR , -13 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -13 , -13 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , -14 , WRD_ERR , WRD_ERR , -14 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -14 , -14 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 20 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 15 , 16 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 21 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -7 , WRD_ERR , WRD_ERR , 22 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 25 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 24 , WRD_ERR , 26 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 23 },
{ 2 , WRD_ERR , WRD_ERR , 3 , WRD_ERR , 4 , WRD_ERR , 5 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 27 , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 7 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 8 , 9 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 28 , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 7 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 8 , 9 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 29 , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 30 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 31 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 32 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ 2 , WRD_ERR , WRD_ERR , 3 , WRD_ERR , 4 , WRD_ERR , 5 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 33 , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , -4 , WRD_ERR , WRD_ERR , WRD_ERR , -4 , WRD_ERR , WRD_ERR , -4 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -4 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ 2 , WRD_ERR , WRD_ERR , 3 , WRD_ERR , 4 , WRD_ERR , 5 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 12 , 34 , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , -5 , WRD_ERR , WRD_ERR , WRD_ERR , -5 , WRD_ERR , WRD_ERR , -5 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 35 , 36 , WRD_ERR , WRD_ERR , WRD_ERR , -5 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 25 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 24 , WRD_ERR , 26 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 37 },
{ WRD_ERR , WRD_ERR , -18 , WRD_ERR , WRD_ERR , WRD_ERR , -18 , WRD_ERR , WRD_ERR , -18 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -18 , -18 , WRD_ERR , -18 , WRD_ERR , -18 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , -19 , WRD_ERR , WRD_ERR , WRD_ERR , -19 , WRD_ERR , WRD_ERR , -19 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -19 , -19 , WRD_ERR , -19 , WRD_ERR , -19 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , 38 , WRD_ERR , WRD_ERR , WRD_ERR , -2 , WRD_ERR , WRD_ERR , -2 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -2 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , -8 , WRD_ERR , WRD_ERR , -8 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -8 , -8 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , -9 , WRD_ERR , WRD_ERR , -9 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 15 , -9 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , -10 , WRD_ERR , WRD_ERR , -10 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -10 , -10 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , -11 , WRD_ERR , WRD_ERR , -11 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -11 , -11 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , -12 , WRD_ERR , WRD_ERR , -12 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -12 , -12 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , -3 , WRD_ERR , WRD_ERR , WRD_ERR , -3 , WRD_ERR , WRD_ERR , -3 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -3 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -6 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 25 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 24 , WRD_ERR , 26 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 39 },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 25 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 24 , WRD_ERR , 26 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 40 },
{ WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 35 , 36 , WRD_ERR , 41 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ 2 , WRD_ERR , WRD_ERR , 3 , WRD_ERR , 4 , WRD_ERR , 5 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , 42 , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , -15 , WRD_ERR , WRD_ERR , WRD_ERR , -15 , WRD_ERR , WRD_ERR , -15 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -15 , 36 , WRD_ERR , -15 , WRD_ERR , -15 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , -16 , WRD_ERR , WRD_ERR , WRD_ERR , -16 , WRD_ERR , WRD_ERR , -16 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -16 , -16 , WRD_ERR , -16 , WRD_ERR , -16 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , -17 , WRD_ERR , WRD_ERR , WRD_ERR , -17 , WRD_ERR , WRD_ERR , -17 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -17 , -17 , WRD_ERR , -17 , WRD_ERR , -17 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
{ WRD_ERR , WRD_ERR , WRD_ERR , -1 , WRD_ERR , WRD_ERR , -1 , WRD_ERR , WRD_ERR , -1 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR , -1 , WRD_ERR , WRD_ERR , WRD_ERR , WRD_ERR },
};
int i;
int j = 0;
int popNum=0;
int staTop=0;
int G_tmp=0;//表示哪一个产生式
int t_num=0;
int i_pointer;//表示i位置的指针
stackinit();
G_init();
push(staTop);
i = word[j].id;
int vn;
//staTop = i;
do{
if(table[staTop][i]>0){
//移进
if(table[staTop][i]==99) {
cout<<"语法分析成功!"<0){ pop(); popNum--; }
i = vn;
staTop = gettop();
//语义分析
switch(G_tmp){
case 0:
break;
case 1://S->if B then S else S
{
Vn *S= new Vn;//生成新的终极符结点
fourexp *f1 = new fourexp;
fourexp *f2 = new fourexp;
S->head = vn_stack[vn_stack_top-3].head;//确定s的四元式的起点
vn_stack[vn_stack_top-3].tail->next = f1 ;//将新的四元式链入成串
f1->next = vn_stack[vn_stack_top-2].head ;//->s1链入四元式组
vn_stack[vn_stack_top-2].tail->next = f2 ;//s1 -> 链入四元式组
f2->next = vn_stack[vn_stack_top-1].head ;//-> s2 链入四元式组
S->tail = vn_stack[vn_stack_top-1].tail ;
f1->join("j=", vn_stack[vn_stack_top-3].t_val, 0, 0, true );
f1->chain = f2 ;
f2->join("jmp","-","-", 0,true);
f2->chain = vn_stack[vn_stack_top-1].tail ;
fourexpHead = S->head ;//链成用fourexpHead传回到主函数中。
pop_vn(3);
push_vn( vn_stack , S );
break;
}
case 2://S->if B then S
{
Vn * S = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
S->head = vn_stack[vn_stack_top-2].head;//确定s的四元式的起点
vn_stack[vn_stack_top-2].tail->next = f1 ;//将新的四元式链入成串
f1->next = vn_stack[vn_stack_top-1].head ;//->s1链入四元式组
S->tail = vn_stack[vn_stack_top-1].tail ;
f1->join("j=", vn_stack[vn_stack_top-2].t_val, 0,
vn_stack[vn_stack_top-1].tail->address,true );
f1->chain = vn_stack[vn_stack_top-1].tail ;
fourexpHead = S->head ;//链成用fourexpHead传回到主函数中。
pop_vn( 2 );
push_vn( vn_stack , S );
break ;
}
case 3 ://S->while B do S
{
Vn * S = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
fourexp * f2 = new fourexp;
S->head = vn_stack[vn_stack_top-2].head;//确定s的四元式的起点
vn_stack[vn_stack_top-2].tail->next = f1 ;//将新的四元式链入成串
f1->next = vn_stack[vn_stack_top-1].head ;//->s1链入四元式组
vn_stack[vn_stack_top-1].tail->next = f2;
f2->next = NULL;
S->tail = f2 ;
f1->join("j=" , vn_stack[vn_stack_top-2].t_val, 0,
0, true );
f1->chain = f2 ;
f2->join("jmp","-","-", 0,true );
f2->chain = vn_stack[vn_stack_top-2].tail;
fourexpHead = S->head ;//链成用fourexpHead传回到主函数中。
pop_vn(2);
push_vn( vn_stack ,S);
break ;
}
case 4 ://S->begin L end
{
Vn * S = new Vn;//生成新的终极符结点
S->head = vn_stack[vn_stack_top-1].head;//确定s的四元式的起点
S->tail = vn_stack[vn_stack_top-1].tail;
fourexpHead = S->head ;//链成用fourexpHead传回到主函数中。
pop_vn( 1 );
push_vn( vn_stack , S );
break;
}
case 5 ://S->i:= E
{
Vn * S = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join(":=",vn_stack[vn_stack_top-1].ch,"-",word[i_pointer].name,false);
S->head = f1 ;
S->tail = f1 ;
}
else{
f1->join(":=", vn_stack[vn_stack_top-1].t_val ,"-",word[i_pointer].name,false);
S->head = vn_stack[vn_stack_top-1].head;//确定s的四元式的起点
vn_stack[vn_stack_top-1].tail->next = f1 ;//将新的四元式链入成串
S->tail = f1 ;
}
fourexpHead = S->head ;//链成用fourexpHead传回到主函数中。
pop_vn( 1 );
push_vn( vn_stack , S );
break;
}
case 6 ://L->S;L
{
Vn * L = new Vn;//生成新的终极符结点
L->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = vn_stack[vn_stack_top-1].head;
L->tail = vn_stack[vn_stack_top-1].tail ;
L->isTmp = true ;
L->t_val = vn_stack[vn_stack_top-1].t_val ;
fourexpHead = L->head ;//链成用fourexpHead传回到主函数中。
pop_vn( 2 );
push_vn( vn_stack , L );
break;
}
case 7 ://L->S
{
Vn * L = new Vn;//生成新的终极符结点
L->head = vn_stack[vn_stack_top-1].head ;
L->tail = vn_stack[vn_stack_top-1].tail ;
L->isTmp = true ;
L->t_val = vn_stack[vn_stack_top-1].t_val ;
fourexpHead = L->head ;//链成用fourexpHead传回到主函数中。
pop_vn( 1);
push_vn( vn_stack , L );
break;
}
case 8 ://B->B&B
{
t_num++ ;
Vn * B = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
if( vn_stack[vn_stack_top-2].isTmp == false ){
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("&",vn_stack[vn_stack_top-2].ch,
vn_stack[vn_stack_top-1].ch , t_num,false );
B->head = f1 ;
B->tail = f1 ;
}
else{
f1->join("&",vn_stack[vn_stack_top-2].ch,
vn_stack[vn_stack_top-1].t_val, t_num,false );
B->head = vn_stack[vn_stack_top-1].head ;
vn_stack[vn_stack_top-1].tail->next = f1 ;
B->tail = f1 ;
pop_vn( 1);
}
}
else{
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("&", vn_stack[vn_stack_top-2].t_val,
vn_stack[vn_stack_top-1].ch, t_num,false );
B->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = f1 ;
B->tail = f1 ;
}
else{
f1->join("&", vn_stack[vn_stack_top-2].t_val ,
vn_stack[vn_stack_top-1].t_val, t_num,false );
B->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = vn_stack[vn_stack_top-1].head;
vn_stack[vn_stack_top-1].tail->next = f1 ;
B->tail = f1 ;
}
}
B->t_val = t_num ;
B->isTmp = true ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
pop_vn( 2);
push_vn( vn_stack , B );
break;
}
case 9 ://B->B|B
{
t_num++ ;
Vn * B = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
if( vn_stack[vn_stack_top-2].isTmp == false ){
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("or",vn_stack[vn_stack_top-2].ch,
vn_stack[vn_stack_top-1].ch , t_num,false );
B->head = f1 ;
B->tail = f1 ;
}
else{
f1->join("|",vn_stack[vn_stack_top-2].ch,
vn_stack[vn_stack_top-1].t_val, t_num,false );
B->head = vn_stack[vn_stack_top-1].head ;
vn_stack[vn_stack_top-1].tail->next = f1 ;
B->tail = f1 ;
pop_vn( 1);
}
}
else{
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("|", vn_stack[vn_stack_top-2].t_val,
vn_stack[vn_stack_top-1].ch, t_num,false );
B->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = f1 ;
B->tail = f1 ;
}
else{
f1->join("|", vn_stack[vn_stack_top-2].t_val ,
vn_stack[vn_stack_top-1].t_val, t_num,false );
B->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = vn_stack[vn_stack_top-1].head;
vn_stack[vn_stack_top-1].tail->next = f1 ;
B->tail = f1 ;
}
}
B->t_val = t_num ;
B->isTmp = true ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
pop_vn( 2);
push_vn( vn_stack , B );
break;
}
case 10 ://B->i>i
{
t_num++ ;
Vn * B = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
f1->join(">",word[j-3].name,word[j-1].name, t_num,false);
B->head = f1 ;
B->tail = f1 ;
B->t_val = t_num ;
B->isTmp = true ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
push_vn( vn_stack , B );
break;
}
case 11 ://B->inext = NULL ;
f1->join("<",word[j-3].name,word[j-1].name, t_num,false);
B->head = f1 ;
B->tail = f1 ;
B->t_val = t_num ;
B->isTmp = true ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
push_vn( vn_stack , B );
break;
}
case 12 ://B->i=i
{
t_num++ ;
Vn * B = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
f1->join("=",word[j-3].name,word[j-1].name, t_num,false);
B->head = f1 ;
B->tail = f1 ;
B->t_val = t_num ;
B->isTmp = true ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
push_vn( vn_stack , B );
break;
}
case 13 ://true
{
Vn * B = new Vn;//生成新的终极符结点
B->head = NULL ;
B->tail = NULL ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
B->ch = word[j-1].name ;
B->isTmp = false ;
push_vn( vn_stack , B);
break;
}
case 14 ://B->false
{
t_num++ ;
Vn * B = new Vn;//生成新的终极符结点
B->head = NULL ;
B->tail = NULL ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
B->ch = word[j-1].name ;
B->isTmp = false ;
push_vn( vn_stack , B);
break;
}
case 15 ://E->E+E
{
t_num++ ;
Vn * E = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
if( vn_stack[vn_stack_top-2].isTmp == false ){
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("+",vn_stack[vn_stack_top-2].ch ,
vn_stack[vn_stack_top-1].ch , t_num, false);
E->head = f1 ;
E->tail = f1 ;
}
else{
f1->join("+",vn_stack[vn_stack_top-2].ch ,
vn_stack[vn_stack_top-1].t_val, t_num,false );
E->head = vn_stack[vn_stack_top-1].head ;
vn_stack[vn_stack_top-1].tail->next = f1 ;
E->tail = f1 ;
}
}
else{
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("+", vn_stack[vn_stack_top-2].t_val ,
vn_stack[vn_stack_top-1].ch , t_num , false);
E->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = f1 ;
E->tail = f1 ;
}
else{
f1->join("+", vn_stack[vn_stack_top-2].t_val ,
vn_stack[vn_stack_top-1].t_val, t_num , false);
E->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = vn_stack[vn_stack_top-1].head;
vn_stack[vn_stack_top-1].tail->next = f1 ;
E->tail = f1 ;
}
}
E->t_val = t_num ;
E->isTmp = true ;
fourexpHead = E->head ;//链成用fourexpHead传回到主函数中。
pop_vn( 2);
push_vn( vn_stack , E );
break;
}
case 16 ://E->E*E
{
t_num++ ;
Vn * E = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
if( vn_stack[vn_stack_top-2].isTmp == false ){
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("*",vn_stack[vn_stack_top-2].ch ,
vn_stack[vn_stack_top-1].ch , t_num , false);
E->head = f1 ;
E->tail = f1 ;
}
else{
f1->join("*",vn_stack[vn_stack_top-2].ch ,
vn_stack[vn_stack_top-1].t_val, t_num,false );
E->head = vn_stack[vn_stack_top-1].head ;
vn_stack[vn_stack_top-1].tail->next = f1 ;
E->tail = f1 ;
}
}
else{
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("*", vn_stack[vn_stack_top-2].t_val ,
vn_stack[vn_stack_top-1].ch , t_num , false);
E->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = f1 ;
E->tail = f1 ;
}
else{
f1->join("*", vn_stack[vn_stack_top-2].t_val ,
vn_stack[vn_stack_top-1].t_val , t_num, false);
E->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = vn_stack[vn_stack_top-1].head;
vn_stack[vn_stack_top-1].tail->next = f1 ;
E->tail = f1 ;
}
}
E->t_val = t_num ;
E->isTmp = true ;
fourexpHead = E->head ;//链成用fourexpHead传回到主函数中。
pop_vn( 2);
push_vn( vn_stack , E );
break;
}
case 17 ://E->(E)
{
Vn * E = new Vn;//生成新的终极符结点
E->head = vn_stack[vn_stack_top-1].head ;
E->tail = vn_stack[vn_stack_top-1].tail ;
fourexpHead = E->head ;//链成用fourexpHead传回到主函数中。
E->isTmp = true ;
E->t_val = vn_stack[vn_stack_top-1].t_val ;
pop_vn( 1);
push_vn( vn_stack , E );
break;
}
case 18 ://E->i
{
Vn * E = new Vn;//生成新的终极符结点
E->head = NULL ;
E->tail = NULL ;
fourexpHead = E->head ;//链成用fourexpHead传回到主函数中。
E->ch = word[j-1].name ;
E->isTmp = false ;
push_vn( vn_stack , E );
break;
}
case 19 ://E->n
Vn * E = new Vn;//生成新的终极符结点
E->head = NULL ;
E->tail = NULL ;
fourexpHead = E->head ;//链成用fourexpHead传回到主函数中。
E->ch = word[j-1].name ;
E->isTmp = false ;
push_vn( vn_stack , E );
break;
}
}
else {
error1();
}
// i = table[i][word[j].id];
}while(!isEmpty(_stack));
}//syntax语法分析
int main(int argc, char* argv[])
{
int length=10;//文件名不能太长,要小于10个字符
char *strbuf;
int i;
fourexpHead=NULL;
// char * filename;
FILE* p;
// if(argc ==2 )
// {
// length = strlen(argv[1]);
// filename = new char[length+1];
// strcpy(filename,argv[1]);
// filename[length] = '\0';
sourceFile = fopen("c1.txt","r");//
if(sourceFile == NULL)
{
cout<<"打开文件失败"<Display();
q = q->next;
}
getchar();
// }//if
return 0;
}