?? scpascal.cpp
字號:
gofrom(i);
i++;
}
}
void InitparseTable(){ //初始化編譯表
int i,j;
for (i = 0; i<MAXSTATES; i++){
for (j = 0; j<NUMOFSYMBOLS; j++){
actionTable[i][j].typ = error;
}
}
for (i = 0; i<MAXSTATES; i++){
for (j = 0; j<NUMOFSYMBOLS; j++){
gotoTable[i][j].typ = error;
}
}
//遍歷goTable,此時actionTable和gotoTable已在gofrom(I)中被設置了一部分
}
void showLR1(){ //顯示LR1分析表
int i;
transnodePtr p;
for (i = 0; i<numofLR1; i++){
printf("%d ",LR1[i].length);
p = LR1[i].tp;
while(p != NULL){
printf("%d%d%d ",p->formula,p->dot,p->forward);
p = p->next;
}
printf("\n");
}
}
void showActionTable(){ //顯示action表的動作
int i,j;
for (i = 0; i<numofLR1; i++){
for (j = T1; j<=T2; j++){
if (actionTable[i][j].typ == shift) {
printf("s%d ",actionTable[i][j].ai.state);
}else if(actionTable[i][j].typ== reduce){
printf("r%d ",actionTable[i][j].ai.ri.formula);
}else if(actionTable[i][j].typ == acc){
printf("ac ");
}else if (actionTable[i][j].typ == error){
printf(" ");
}
}
printf("\n");
}
}
void showGotoTable(){ //顯示goto表的動作
int i,j;
for (i = 0; i<numofLR1; i++){
for (j = NT1; j<=NT2; j++){
if(gotoTable[i][j].typ == ok){
printf("%d ",gotoTable[i][j].gi.state);
}else{
printf(" ");
}
}
printf("\n");
}
}
void testTable(){ //打印goto表與action表
printf("actionTable:\n");
showActionTable();
printf("gotoTable:\n");
showGotoTable();
}
void InitTable(){ //初始化所有的表
Init();
InitparseTable();
InitLR1();
}
//S_ListNodePtr label_property;
//L_ListNodePtr currentNode;
int isKeyword(int x){
return 1;
}
L_ListNodePtr currentPtr;
struct symbol_table* property;
int getLabel(){ //從記號流獲取記號類型.
currentPtr = currentPtr->next;
property = currentPtr->enter;
int x = currentPtr->label_type;
switch (x)
{
case op_equ:
{
x = rw_relop;
break;
}
case op_nequ:
{
x = rw_relop;
break;
}
case op_ls:
{
x = rw_relop;
break;
}
case op_le:
{
x = rw_relop;
break;
}
case op_gr:
{
x = rw_relop;
break;
}
case op_ge:
{
x = rw_relop;
break;
}
case op_add:
{
x = rw_addop;
break;
}
case op_sub:
{
x = rw_addop;
break;
}
case rw_or:
{
x = rw_addop;
break;
}
case op_mul:
{
x = rw_mulop;
break;
}
case op_div:
{
x = rw_mulop;
break;
}
case rw_divv:
{
x = rw_mulop;
break;
}
case rw_mod:
{
x = rw_mulop;
break;
}
case rw_and:
{
x = rw_mulop;
break;
}
}
return (x);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/////weilei////////////////////////////////////////////////////////////////////////////////////////////////
//移進歸約共用體的定義
union action_types
{
struct label_stream *shift_type; //移進,記號流指針
int production_num; //歸約,產生式號
};
//id鏈表的定義
struct id_list
{
struct symbol_table *nodes;
struct id_list *next;
};
struct id_list *head, *ps;
//parameter鏈表定義
struct para_list
{
struct id_list *nodes;
struct para_list *next;
};
struct para_list *para_head,*para_ps;
//expression_list定義
int expr_list,expr_num;
//類型棧所保存的結構體定義
struct type_stack_element{
int type_type; //0基本類型,1復合類型(即數組類型)
int type_num; //基本(或數組元素)類型號:1整型,2實型,3BOOL
struct label_stream *type_nodes; //終結符的記號流指針
};
//類型棧的定義
struct type_stack_element *type_stack[MAX];
int type_point = 0;
int type_push(struct type_stack_element* x){ //壓入類型棧
if (type_point == MAX){
return 0;
}else{
type_point++;
type_stack[type_point] = x;
return 1;
}
}
struct type_stack_element* type_pop(){ //彈出類型棧
type_point--;
return type_stack[type_point+1];
}
void type_check(int action_type,union action_types action_director) //action_type==0移進,==1歸約
{ //類型檢查函數
int i,j;
struct type_stack_element * temp_element1,* temp_element2;
if (action_type==0) //移進
{
switch (action_director.shift_type->label_type)
{
case 0: //id
temp_element1=new struct type_stack_element;
temp_element1->type_nodes=action_director.shift_type;
temp_element1->type_type=temp_element1->type_nodes->enter->id_type_type;
temp_element1->type_num=temp_element1->type_nodes->enter->id_type;
type_push(temp_element1);
break;
case 1: //num
temp_element1= new struct type_stack_element;
temp_element1->type_nodes=action_director.shift_type;
temp_element1->type_type=0;
temp_element1->type_nodes->enter->id_type_type=0;
temp_element1->type_num=1; //int
temp_element1->type_nodes->enter->id_type=1;
for(i=0;i<63;i++)
{
if (action_director.shift_type->enter->name[i]=='.')
{
temp_element1->type_num=2; //real
temp_element1->type_nodes->enter->id_type=2;
}
}
type_push(temp_element1);
break;
case 6: //boolean
temp_element1=new struct type_stack_element;
temp_element1->type_type=0;
temp_element1->type_num=3; //bool
temp_element1->type_nodes=action_director.shift_type;
type_push(temp_element1);
break;
case 10: //false
temp_element1=new struct type_stack_element;
temp_element1->type_type=0;
temp_element1->type_num=3; //bool
temp_element1->type_nodes=action_director.shift_type;
type_push(temp_element1);
break;
case 13: //integer
temp_element1=new struct type_stack_element;
temp_element1->type_type=0;
temp_element1->type_num=1; //int
temp_element1->type_nodes=action_director.shift_type;
type_push(temp_element1);
break;
case 20: //real
temp_element1=new struct type_stack_element;
temp_element1->type_type=0;
temp_element1->type_num=2; //real
temp_element1->type_nodes=action_director.shift_type;
type_push(temp_element1);
break;
case 23: //true
temp_element1=new struct type_stack_element;
temp_element1->type_type=0;
temp_element1->type_num=3; //bool
temp_element1->type_nodes=action_director.shift_type;
type_push(temp_element1);
break;
case 47: //id
temp_element1= new struct type_stack_element;
temp_element1->type_nodes=action_director.shift_type;
temp_element1->type_type=0;
temp_element1->type_nodes->enter->id_type_type=0;
temp_element1->type_num=1; //int
temp_element1->type_nodes->enter->id_type=1;
type_push(temp_element1);
break;
}
}else //歸約
{
switch (action_director.production_num)
{
case 2:
type_pop();
type_pop();
break;
case 4:
temp_element1=type_pop();
ps=head;
head=new struct id_list;
head->next=ps;
head->nodes=temp_element1->type_nodes->enter;
break;
case 5:
temp_element1=type_pop();
head=new struct id_list;
head->next=NULL;
head->nodes=temp_element1->type_nodes->enter;
// para_head=new struct para_list;
// para_head->nodes=head;
// para_head->next=NULL;
type_push(temp_element1);
break;
case 8:
temp_element1=type_pop();
while (!(head->next==NULL))
{
head->nodes->id_type=temp_element1->type_num;
head->nodes->id_type_type=temp_element1->type_type;
head->nodes->function_type=0;
head=head->next;
}
if ((head->nodes->id_type==1)||(head->nodes->id_type==2)||(head->nodes->id_type==3))
{printf("Redirection error!\n");} else {
head->nodes->id_type=temp_element1->type_num;
head->nodes->id_type_type=temp_element1->type_type;
head->nodes->function_type=0;}
type_pop();
break;
case 9:
temp_element1=type_pop();
while (!(head->next==NULL))
{
head->nodes->id_type=temp_element1->type_num;
head->nodes->id_type_type=temp_element1->type_type;
head->nodes->function_type=0;
head=head->next;
}
if ((head->nodes->id_type==1)||(head->nodes->id_type==2)||(head->nodes->id_type==3))
{printf("Redirection error!\n");} else {
head->nodes->id_type=temp_element1->type_num;
head->nodes->id_type_type=temp_element1->type_type;
head->nodes->function_type=0;}
// head->nodes->id_type=temp_element1->type_num;
// head->nodes->id_type_type=temp_element1->type_type;
// head->nodes->function_type=0;
type_pop();
break;
case 11:
temp_element1=type_pop();
temp_element1->type_type=1;
type_pop();
type_pop();
type_push(temp_element1);
break;
case 16:
temp_element1=type_pop();
type_pop();
type_push(temp_element1);
break;
/////////////////////////////////////////////////////////////////////////////////////////
case 20:
temp_element1=type_pop();
temp_element2=type_pop();
temp_element2->type_nodes->enter->id_type=temp_element1->type_num;
temp_element2->type_nodes->enter->function_type=1;
temp_element2->type_nodes->enter->function_para=0;
//////////////////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
while (!(para_head==NULL))
{
while (!(para_head->nodes==NULL))
{
temp_element2->type_nodes->enter->function_para=
temp_element2->type_nodes->enter->function_para*10+para_head->nodes->nodes->id_type;
para_head->nodes=para_head->nodes->next;
}
para_head=para_head->next;
}
//////////////////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
break;
case 21:
temp_element2=type_pop();
temp_element2->type_nodes->enter->id_type=0;
temp_element2->type_nodes->enter->function_type=1;
break;
case 23:
para_head=NULL;
break;
case 24:
temp_element1=type_pop();
para_ps=para_head;
para_head=new struct para_list;
para_head->nodes=head;
para_head->next=para_ps;
while (!(head->next==NULL))
{
head->nodes->id_type=temp_element1->type_num;
head->nodes->id_type_type=temp_element1->type_type;
head->nodes->function_type=0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -