一、语法分析器的工作流程为:每次从词法分析器产生的lex.txt文件中读取一个单词符号,根据预测分析表以及状态(整型)栈、符号(token结构体类型)栈的栈顶决定执行移进/规约/接受/error动作。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <table.h> 5 #include <stack.h> 6 7 stack s1; 8 stack s2; 9 pstack state = &s1; 10 pstack symbol = &s2; 11 FILE *fp; //获取文件的指针 12 int newflag = 0; //标志是否新读入一个token 13 14 int ReadToken(); /*make(返回结构体)从文件中读取一行,返回数字*/ 15 void Reduction_Goto(int k); /*按第k个产生式规约*/ 16 17 int main() 18 { 19 int token; /*种别码*/ 20 int index; 21 int statenum; 22 int tokennum; 23 MakeNull(state); 24 MakeNull(symbol); 25 fp = fopen("lex.txt","r"); 26 27 push(state,0); 28 push(symbol,0); 29 printf("stack production"); 30 31 while(1) 32 { 33 printf(" "); 34 PrintStack(state,0); 35 printf("%c",'&'); 36 PrintStack(symbol,1); 37 38 if(newflag == 0) 39 { 40 token = ReadToken(); 41 } 42 /*printf("token:%d",token);*/ 43 statenum = state->elem[state->top]; 44 tokennum = yytranslate[token]; 45 46 if(yypact[statenum] == YYPACT_NINF) /*按默认产生式规约*/ 47 { 48 if(yydefact[statenum] == 0) 49 { 50 printf(" error! "); 51 break; 52 } 53 else if(yydefact[statenum] == 1) 54 { 55 printf(" accept! "); 56 break; 57 } 58 else 59 { 60 Reduction_Goto(yydefact[statenum]); 61 newflag = 1; 62 } 63 } 64 else 65 { 66 index = yypact[statenum] + tokennum; 67 /*printf("index:%d",index);*/ 68 if((index >= LCHECK) || (yycheck[index] != tokennum)) /*按默认产生式规约*/ 69 { 70 if(yydefact[statenum] == 0) 71 { 72 printf(" error! "); 73 break; 74 } 75 else if(yydefact[statenum] == 1) 76 { 77 printf(" accept! "); 78 break; 79 } 80 else 81 { 82 Reduction_Goto(yydefact[statenum]); 83 newflag = 1; 84 } 85 } 86 else 87 { 88 if(yytable[index] == YYTABLE_NINF) 89 { 90 printf(" error! "); 91 break; 92 } 93 else if(yytable[index] == 0) 94 { 95 if(yydefact[statenum] == 0) 96 { 97 printf(" error! "); 98 break; 99 } 100 else if(yydefact[statenum] == 1) 101 { 102 printf(" accept! "); 103 break; 104 } 105 else 106 { 107 Reduction_Goto(yydefact[statenum]); 108 newflag = 1; 109 } 110 } 111 else if(yytable[index] < 0) 112 { 113 Reduction_Goto(-yytable[index]); /*按产生式规约,变负*/ 114 newflag = 1; 115 } 116 else 117 { 118 push(state,yytable[index]); 119 push(symbol,tokennum); 120 newflag = 0; 121 } 122 } 123 } 124 } 125 126 fclose(fp); 127 return 0; 128 } 129 int ReadToken() 130 { 131 char strLine[1024]; 132 char n1[10]; 133 int i; 134 if(feof(fp)||(NULL == fgets(strLine,1024,fp))) 135 { 136 return 0; 137 } 138 for(i=1;;i++) 139 { 140 if(strLine[i] == ',') 141 { 142 n1[i-1] = '