一、語法分析器的工作流程為:每次從詞法分析器產生的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\t\t\t\tproduction"); 30 31 while(1) 32 { 33 printf("\n"); 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("\nerror!\n"); 51 break; 52 } 53 else if(yydefact[statenum] == 1) 54 { 55 printf("\naccept!\n"); 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("\nerror!\n"); 73 break; 74 } 75 else if(yydefact[statenum] == 1) 76 { 77 printf("\naccept!\n"); 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("\nerror!\n"); 91 break; 92 } 93 else if(yytable[index] == 0) 94 { 95 if(yydefact[statenum] == 0) 96 { 97 printf("\nerror!\n"); 98 break; 99 } 100 else if(yydefact[statenum] == 1) 101 { 102 printf("\naccept!\n"); 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] = '\0'; 143 return atoi(n1); 144 /*break;*/ 145 } 146 n1[i-1] = strLine[i]; 147 } 148 /*return 0;*/ 149 /*printf("%d",atoi(n1));*/ 150 /*return atoi(n1);*/ 151 } 152 153 void Reduction_Goto(int k) /*按第k個產生式規約,k為正數*/ 154 { 155 /*printf("shizi:%d",k);*/ 156 int len = yyr2[k]; 157 int array[len]; 158 int i,index; 159 int symbolnum,statenum; 160 161 for(i = 0;i < len;i++) 162 { 163 pop(state); 164 } 165 for(i = 0;i < len;i++) 166 { 167 array[i] = pop(symbol); 168 } 169 push(symbol,yyr1[k]); 170 171 printf(" "); /*begin打印產生式*/ 172 printf("&&%s",yytname[yyr1[k]]); 173 printf("%s","->"); 174 for(i = len - 1 ;i >= 0;i--) 175 { 176 printf("%s ",yytname[array[i]]); 177 } /*end*/ 178 179 printf("\n"); 180 PrintStack(state,0); 181 printf("%c",'&'); 182 PrintStack(symbol,1); 183 184 symbolnum = symbol->elem[symbol->top] - TN; 185 statenum = state->elem[state->top]; 186 187 if(yypgoto[symbolnum] == YYPACT_NINF) 188 { 189 push(state,yydefgoto[symbolnum]); 190 } 191 else 192 { 193 index = yypgoto[symbolnum] + statenum; 194 if((index >= LCHECK) || (yycheck[index] != statenum)) 195 { 196 push(state,yydefgoto[symbolnum]); 197 } 198 else 199 { 200 push(state,yytable[index]); 201 } 202 } 203 }

1 #define N 1000 2 3 typedef struct{ //整型棧 4 int top; 5 int elem[N]; 6 }stack; 7 typedef stack* pstack; 8 9 typedef struct{ //整型棧 10 int top; 11 symtbl* elem[N]; 12 }sstack; 13 typedef sstack* psstack; 14 15 void MakeNull(pstack S) 16 { 17 S->top = N ; 18 } 19 20 void push(pstack S,int opd) 21 { 22 if(S->top == 0) 23 { 24 return ; 25 } 26 S->top--; 27 S->elem[S->top] = opd; 28 } 29 30 int pop(pstack S) 31 { 32 int ret = S->elem[S->top]; 33 S->top++; 34 return ret; 35 } 36 37 void PrintStack(pstack S,int ctrl) /*沒打印空行*/ 38 { 39 int i; 40 if(ctrl == 0) //打印狀態棧 41 { 42 for(i = N-1;i >= S->top;i--) 43 { 44 printf("%d ",S->elem[i]); 45 } 46 } 47 else //打印符號棧 48 { 49 for(i = N-1;i >= S->top;i--) 50 { 51 printf("%s ",yytname[S->elem[i]]); 52 } 53 } 54 } 55 56 void MakeNulls(psstack S) 57 { 58 S->top = N ; 59 } 60 61 void pushs(psstack S,symtbl* opd) 62 { 63 if(S->top == 0) 64 { 65 return ; 66 } 67 S->top--; 68 S->elem[S->top] = opd; 69 } 70 71 void pops(psstack S) 72 { 73 S->top++; 74 }

1 #define TN 67 /*終結符數,不含accept!!!*/ 2 #define LCHECK 551 /*make check表長度*/ 3 4 typedef int yytype_uint8; 5 typedef int yytype_int16; 6 7 static const yytype_uint8 yytranslate[] = /*token[0]=0!!!!必須的*/ 8 { 9 0,3,4,44,6,10,12,13,16,17,18, 10 45,21,23,25,28,29,30,36,37,38, 11 40,41,43,47,48,51,52,55,59,60, 12 61,62,64,65,66,27,11,50,7,46, 13 35,57,56,19,34,26,32,24,39,33, 14 53,9,42,14,15,8,5,54,63,58, 15 31,49,22,20 16 };/*種別碼和符號數的對應關系*/ 17 18 static const char *const yytname[] = 19 { 20 "$end", "error", "$undefined", "AND", "ARRAY", "ASSIGNMENT", "CASE", 21 "CHARACTER_STRING", "COLON", "COMMA", "CONST", "DIGSEQ", "DIV", "DO", 22 "DOT", "DOTDOT", "DOWNTO", "ELSE", "END", "EQUAL", "EXTERNAL", "FOR", 23 "FORWARD", "FUNCTION", "GE", "GOTO", "GT", "IDENTIFIER", "IF", "IN", 24 "LABEL", "LBRAC", "LE", "LPAREN", "LT", "MINUS", "MOD", "NIL", "NOT", 25 "NOTEQUAL", "OF", "OR", "OTHERWISE", "PACKED", "PBEGIN", "PFILE", "PLUS", 26 "PROCEDURE", "PROGRAM", "RBRAC", "REALNUMBER", "RECORD", "REPEAT", 27 "RPAREN", "SEMICOLON", "SET", "SLASH", "STAR", "STARSTAR", "THEN", "TO", 28 "TYPE", "UNTIL", "UPARROW", "VAR", "WHILE", "WITH", "$accept", "file", 29 "program", "muldec_m1", "program_heading", "identifier_list", "block", 30 "label_declaration_part", "label_list", "label", 31 "constant_definition_part", "constant_list", "constant_definition", 32 "cexpression", "csimple_expression", "cterm", "cfactor", 33 "cexponentiation", "cprimary", "constant", "sign", "non_string", 34 "type_definition_part", "type_definition_list", "type_definition", 35 "type_denoter", "new_type", "new_ordinal_type", "enumerated_type", 36 "subrange_type", "new_structured_type", "structured_type", "array_type", 37 "index_list", "index_type", "ordinal_type", "component_type", 38 "record_type", "record_section_list", "record_section", "variant_part", 39 "variant_selector", "variant_list", "variant", "case_constant_list", 40 "case_constant", "tag_field", "tag_type", "set_type", "base_type", 41 "file_type", "new_pointer_type", "domain_type", 42 "variable_declaration_part", "variable_declaration_list", 43 "variable_declaration", "procedure_and_function_declaration_part", 44 "proc_or_func_declaration_list", "proc_or_func_declaration", 45 "procedure_declaration", "muldec_m2", "procedure_heading", "directive", 46 "formal_parameter_list", "formal_parameter_section_list", 47 "formal_parameter_section", "value_parameter_specification", 48 "variable_parameter_specification", "procedural_parameter_specification", 49 "functional_parameter_specification", "procedure_identification", 50 "procedure_block", "function_declaration", "function_heading", 51 "result_type", "function_identification", "function_block", 52 "statement_part", "compound_statement", "statement_sequence", 53 "statement", "open_statement", "closed_statement", 54 "non_labeled_closed_statement", "non_labeled_open_statement", 55 "repeat_statement", "open_while_statement", "closed_while_statement", 56 "open_for_statement", "closed_for_statement", "open_with_statement", 57 "closed_with_statement", "open_if_statement", "closed_if_statement", 58 "assignment_statement", "variable_access", "indexed_variable", 59 "index_expression_list", "index_expression", "field_designator", 60 "procedure_statement", "params", "actual_parameter_list", 61 "actual_parameter", "goto_statement", "case_statement", "case_index", 62 "case_list_element_list", "case_list_element", "otherwisepart", 63 "control_variable", "initial_value", "direction", "final_value", 64 "record_variable_list", "boolean_expression", "expression", 65 "simple_expression", "term", "factor", "exponentiation", "primary", 66 "unsigned_constant", "unsigned_number", "unsigned_integer", 67 "unsigned_real", "function_designator", "set_constructor", 68 "member_designator_list", "member_designator", "addop", "mulop", "relop", 69 "identifier", "semicolon", "comma", 0 70 }; 71 72 static const yytype_uint8 yyr1[] = 73 { 74 0, 67, 68, 69, 70, 71, 71, 72, 72, 73, 75 74, 74, 75, 75, 76, 77, 77, 78, 78, 79, 76 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 77 85, 85, 85, 85, 86, 86, 86, 87, 87, 88, 78 88, 88, 89, 89, 90, 90, 91, 92, 92, 93, 79 93, 93, 94, 94, 95, 96, 97, 97, 98, 98, 80 98, 98, 99, 100, 100, 101, 102, 102, 103, 104, 81 104, 104, 105, 105, 106, 107, 107, 107, 108, 108, 82 109, 109, 110, 110, 110, 111, 111, 112, 112, 113, 83 114, 115, 116, 117, 118, 119, 120, 120, 121, 121, 84 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 85 128, 128, 129, 129, 130, 131, 131, 132, 132, 132, 86 132, 133, 134, 135, 136, 137, 138, 139, 139, 139, 87 140, 140, 141, 142, 143, 144, 145, 146, 146, 147, 88 147, 148, 148, 149, 149, 150, 150, 150, 150, 150, 89 150, 150, 150, 150, 150, 150, 151, 151, 151, 151, 90 152, 153, 154, 155, 156, 157, 158, 159, 159, 160, 91 161, 162, 162, 162, 162, 163, 164, 164, 165, 166, 92 167, 167, 168, 169, 169, 170, 170, 170, 171, 172, 93 172, 172, 172, 173, 174, 174, 175, 176, 176, 177, 94 178, 179, 179, 180, 181, 181, 182, 183, 183, 184, 95 184, 185, 185, 186, 186, 187, 187, 188, 188, 188, 96 188, 188, 188, 189, 189, 189, 190, 190, 191, 192, 97 193, 194, 194, 195, 195, 196, 196, 197, 197, 197, 98 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, 99 199, 199, 200, 201, 202 100 }; 101 102 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ 103 static const yytype_uint8 yyr2[] = 104 { 105 0, 2, 1, 5, 0, 2, 5, 3, 1, 6, 106 3, 0, 3, 1, 1, 2, 0, 2, 1, 4, 107 1, 3, 1, 3, 1, 3, 2, 1, 1, 3, 108 1, 3, 1, 2, 1, 2, 1, 1, 1, 1, 109 1, 1, 2, 0, 2, 1, 4, 1, 1, 1, 110 1, 1, 1, 1, 3, 3, 1, 2, 1, 1, 111 1, 1, 6, 3, 1, 1, 1, 1, 1, 3, 112 5, 3, 3, 1, 3, 5, 4, 0, 3, 1, 113 3, 1, 5, 7, 5, 3, 1, 1, 3, 1, 114 1, 3, 1, 3, 2, 1, 3, 0, 3, 1, 115 3, 2, 0, 3, 1, 1, 1, 3, 4, 0, 116 1, 2, 1, 1, 3, 3, 1, 1, 1, 1, 117 1, 3, 4, 1, 1, 2, 1, 3, 3, 3, 118 4, 5, 1, 2, 1, 1, 3, 3, 1, 1, 119 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 120 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 121 4, 4, 4, 8, 8, 4, 4, 4, 6, 6, 122 3, 1, 1, 1, 2, 4, 3, 1, 1, 3, 123 2, 1, 3, 3, 1, 1, 3, 5, 2, 5, 124 6, 8, 9, 1, 3, 1, 3, 1, 2, 1, 125 1, 1, 1, 1, 3, 1, 1, 1, 3, 1, 126 3, 1, 3, 2, 1, 1, 3, 1, 1, 1, 127 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 128 2, 3, 2, 3, 1, 3, 1, 1, 1, 1, 129 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 130 1, 1, 1, 1, 1 131 }; 132 133 static const yytype_uint8 yydefact[] = 134 { 135 0, 0, 0, 2, 0, 252, 5, 1, 253, 4, 136 0, 11, 0, 8, 0, 0, 16, 254, 6, 0, 137 14, 0, 13, 3, 0, 43, 7, 10, 0, 15, 138 18, 0, 0, 97, 12, 17, 0, 42, 45, 0, 139 0, 102, 224, 228, 0, 38, 225, 0, 37, 229, 140 0, 20, 22, 24, 27, 28, 0, 32, 223, 226, 141 227, 30, 44, 0, 0, 0, 99, 0, 0, 0, 142 0, 104, 105, 0, 110, 106, 0, 0, 0, 33, 143 19, 245, 250, 248, 251, 249, 247, 238, 246, 239, 144 237, 0, 0, 244, 242, 243, 241, 240, 0, 0, 145 26, 0, 36, 39, 0, 0, 0, 41, 77, 0, 146 0, 0, 0, 34, 0, 48, 49, 52, 53, 50, 147 56, 58, 59, 60, 61, 51, 47, 0, 96, 133, 148 125, 155, 9, 135, 101, 109, 0, 111, 11, 11, 149 31, 23, 21, 25, 29, 0, 0, 57, 0, 0, 150 0, 0, 73, 0, 0, 94, 95, 0, 35, 40, 151 46, 100, 98, 0, 0, 0, 0, 0, 0, 155, 152 0, 0, 0, 148, 0, 138, 139, 140, 144, 142, 153 150, 158, 153, 159, 154, 156, 151, 157, 152, 145, 154 0, 172, 173, 146, 147, 149, 171, 103, 113, 112, 155 11, 107, 0, 0, 0, 123, 0, 116, 117, 118, 156 119, 120, 124, 134, 127, 129, 128, 66, 0, 64, 157 65, 67, 54, 68, 93, 0, 0, 79, 89, 0, 158 69, 77, 71, 92, 91, 55, 130, 132, 0, 0, 159 0, 0, 0, 217, 0, 193, 207, 209, 211, 214, 160 215, 218, 219, 220, 171, 0, 199, 188, 0, 206, 161 0, 0, 205, 0, 171, 155, 136, 155, 0, 0, 162 0, 174, 0, 180, 126, 108, 0, 0, 0, 114, 163 0, 0, 0, 0, 0, 74, 72, 0, 131, 232, 164 236, 0, 234, 0, 222, 213, 0, 0, 0, 0, 165 0, 230, 0, 155, 0, 155, 155, 0, 143, 141, 166 137, 170, 179, 0, 177, 178, 0, 184, 185, 0, 167 121, 115, 0, 63, 87, 76, 81, 0, 86, 78, 168 90, 70, 231, 0, 0, 221, 0, 0, 195, 210, 169 208, 212, 216, 0, 200, 167, 140, 160, 161, 162, 170 165, 166, 204, 175, 0, 182, 0, 0, 122, 62, 171 0, 75, 0, 0, 233, 235, 155, 189, 253, 0, 172 202, 201, 0, 155, 176, 183, 186, 88, 80, 77, 173 85, 196, 190, 197, 194, 155, 0, 203, 168, 169, 174 0, 0, 0, 198, 0, 155, 187, 82, 77, 84, 175 191, 0, 163, 164, 0, 192, 83 176 }; 177 178 /* YYDEFGOTO[NTERM-NUM]. */ 179 static const yytype_int16 yydefgoto[] = 180 { 181 -1, 2, 3, 11, 4, 150, 213, 16, 21, 172, 182 25, 29, 30, 50, 51, 52, 53, 54, 55, 111, 183 242, 113, 33, 37, 38, 223, 115, 116, 117, 118, 184 119, 120, 121, 218, 219, 220, 224, 122, 151, 152, 185 153, 225, 325, 326, 327, 328, 226, 227, 123, 234, 186 124, 125, 155, 41, 65, 66, 69, 70, 71, 72, 187 200, 73, 201, 164, 206, 207, 208, 209, 210, 211, 188 74, 275, 75, 76, 236, 77, 215, 132, 173, 174, 189 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 190 185, 186, 187, 188, 189, 243, 191, 313, 314, 192, 191 193, 273, 316, 317, 194, 195, 244, 337, 338, 385, 192 255, 343, 372, 386, 263, 258, 259, 246, 247, 248, 193 249, 250, 251, 58, 59, 60, 252, 253, 291, 292, 194 91, 98, 92, 254, 267, 19 195 }; 196 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing 197 STATE-NUM. */ 198 #define YYPACT_NINF -286 199 static const yytype_int16 yypact[] = 200 { 201 1, 27, 69, -286, 34, -286, 67, -286, -286, -286, 202 27, 87, 25, -286, 109, 115, 113, -286, -286, 27, 203 -286, 6, -286, -286, 27, 70, -286, -286, 109, 27, 204 -286, 118, 27, 96, -286, -286, 439, 27, -286, 147, 205 27, 180, -286, -286, 439, -286, -286, 446, -286, -286, 206 34, 504, 131, -286, -286, 150, 439, -286, -286, -286, 207 -286, -286, -286, 372, 171, 34, -286, 27, 27, 167, 208 34, -286, -286, 34, 185, -286, 34, 34, 168, -286, 209 -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, 210 -286, 439, 439, -286, -286, -286, -286, -286, 439, 446, 211 -286, 200, -286, -286, 27, 73, 195, -286, 11, 213, 212 27, 240, 114, -286, 34, -286, -286, -286, -286, -286, 213 -286, -286, -286, -286, -286, -286, 242, 372, 27, 186, 214 -286, 288, -286, -286, 180, 88, 182, -286, 222, 87, 215 -286, 131, 179, -286, -286, 331, 28, -286, 372, 27, 216 173, 22, -286, 247, 331, -286, -286, 481, -286, -286, 217 -286, -286, -286, 27, 259, 414, 27, 109, 414, 288, 218 414, 27, 261, -286, 65, -286, -286, -286, -286, -286, 219 -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, 220 51, -286, -286, -286, -286, -286, 189, -286, -286, -286, 221 87, -286, 27, 27, 183, -286, 146, -286, -286, -286, 222 -286, -286, -286, -286, -286, -286, -286, -286, 24, -286, 223 -286, 242, -286, -286, -286, 238, 268, -286, 248, 372, 224 -286, 11, -286, -286, -286, -286, -286, -286, 27, 393, 225 414, 460, 414, 75, 249, -286, 504, 131, -286, -286, 226 229, -286, -286, -286, 257, 275, -286, -286, 232, -286, 227 -9, 279, 75, 236, -286, 346, -286, 288, 414, 27, 228 414, -286, 414, -286, -286, -286, 186, 239, 27, -286, 229 182, 256, 331, 481, 27, -286, -286, 280, -286, -286, 230 -286, 43, 278, 244, -286, -286, 481, 414, 414, 414, 231 460, -286, 414, 288, 414, 288, 288, 27, -286, -286, 232 -286, -286, -286, 55, -286, -286, 32, -286, 292, 27, 233 -286, -286, 372, -286, 286, 34, -286, 251, -286, -286, 234 -286, -286, -286, 414, 414, -286, 253, 156, -286, 131, 235 179, -286, -286, 42, -286, -286, 290, -286, -286, -286, 236 -286, -286, 75, -286, 414, -286, 414, 414, -286, -286, 237 481, 481, 270, 481, 278, -286, 288, -286, 294, 479, 238 -286, -286, 414, 288, -286, -286, 306, -286, -286, 11, 239 -286, -286, -286, 309, -286, 288, 307, -286, -286, -286, 240 414, 220, 266, -286, 158, 288, -286, -286, 11, -286, 241 -286, 308, -286, -286, 271, -286, -286 242 }; 243 244 /* YYPGOTO[NTERM-NUM]. */ 245 static const yytype_int16 yypgoto[] = 246 { 247 -286, -286, -286, -286, -286, 47, -10, -286, -286, -6, 248 -286, -286, 296, 284, 237, 243, -26, 231, 289, -137, 249 -12, 221, -286, -286, 300, -57, -286, -142, -286, -286, 250 -286, 234, -286, -286, 59, 190, 21, -286, -34, -227, 251 -221, -286, -286, -15, -285, -16, -286, 66, -286, -286, 252 -286, -286, -286, -286, -286, 227, -286, -286, 235, -286, 253 -286, -111, 218, 287, -286, 83, -286, -286, -286, -286, 254 -286, -286, -286, -107, 132, -286, 241, -286, 313, 206, 255 -253, -279, -210, 120, 121, -286, -286, -286, -286, -286, 256 -286, -286, -286, -286, -286, -110, -286, -286, 33, -286, 257 -286, 134, -286, 35, -286, -286, -286, -286, 23, -286, 258 -286, -286, -286, -286, -286, -165, -118, 95, 98, -200, 259 101, 155, 142, -286, -286, -286, -286, -286, -286, 76, 260 -239, -234, 157, -1, -2, -5 261 }; 262 263 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If 264 positive, shift that token. If negative, reduce the rule which 265 number is the opposite. If zero, do what YYDEFACT says. 266 If YYTABLE_NINF, syntax error. */ 267 #define YYTABLE_NINF -182 268 static const yytype_int16 yytable[] = 269 { 270 6, 15, 9, 217, 286, 261, 114, 297, 22, 13, 271 287, 336, 217, 299, 310, 17, 28, 149, 26, 27, 272 235, 190, 34, 31, 56, 205, 348, 350, 31, 212, 273 100, 39, 56, 17, 17, 61, 39, 17, 5, 13, 274 230, 17, 295, 61, 56, 8, 61, 245, 80, 1, 275 345, 112, 17, 304, 5, 61, 268, 12, 370, 190, 276 8, 262, 126, 128, 17, 269, 129, 130, 134, 7, 277 161, 135, 143, 281, 138, 139, 8, 101, 18, 56, 278 56, 222, 270, 266, 336, 355, 56, 64, 8, 269, 279 61, 61, 332, 346, 388, 349, 351, 61, 61, 341, 280 10, 297, 371, 13, 353, 299, 270, 13, 198, 156, 281 199, 159, 160, 381, 271, 112, 402, 14, 106, 8, 282 20, 290, 293, 24, 108, 103, 126, 13, 109, 23, 283 196, 32, 394, 112, 93, 13, 112, 36, 271, 347, 284 217, 5, 112, 94, 221, 112, 324, 126, 228, 231, 285 311, 146, 315, 221, 318, 190, 159, 190, 392, 324, 286 40, 257, 237, 389, 107, 256, 63, 95, 196, 205, 287 264, 286, 285, 212, 367, 64, 400, 404, 57, 127, 288 17, 229, 17, 204, 344, 403, 57, 96, 97, 57, 289 274, 278, 17, 190, 163, 190, 190, 352, 57, 279, 290 8, 276, 13, 67, 280, 202, -181, -181, 99, 5, 291 368, 131, 401, 282, 87, 290, 365, 112, 136, 136, 292 89, 140, 272, 377, 324, 90, 324, 68, 126, 68, 293 13, 145, 324, 57, 57, 148, 315, 237, 318, 376, 294 57, 57, 198, -181, 199, 17, 203, 319, 17, 306, 295 277, -181, 14, 154, 387, 157, 190, -40, 307, 362, 296 17, 366, 17, 190, 196, 232, 196, 238, 312, 265, 297 112, 112, 396, 397, 8, 190, 284, 320, 283, 13, 298 302, 221, 159, 330, 112, 190, 333, 300, -90, 296, 299 272, 303, 305, 334, 165, 159, 322, 335, 331, 20, 300 357, 360, 196, 379, 196, 196, 264, 373, 354, 166, 301 112, 356, 382, 167, 390, 5, 168, 393, 358, 399, 302 395, 126, 363, 361, 406, 35, 405, 204, 78, 142, 303 144, 363, 131, 158, 141, 369, 79, 62, 102, 147, 304 169, 323, 103, 359, 233, 391, 378, 380, 112, 112, 305 329, 112, 165, 170, 171, 162, 214, 112, 5, 159, 306 159, 137, 159, 321, 104, 196, 45, 166, 159, 197, 307 288, 167, 196, 5, 168, 260, 101, 48, 13, 102, 308 216, 107, 133, 103, 196, 308, 309, 374, 301, 398, 309 131, 375, 384, 340, 196, 339, 294, 13, 169, 5, 310 42, 342, 0, 298, 43, 104, 0, 45, 0, 364, 311 0, 170, 171, 0, 0, 105, 0, 106, 48, 0, 312 5, 42, 107, 108, 239, 43, 240, 109, 45, 0, 313 46, 241, 0, 0, 0, 110, 0, 0, 0, 48, 314 0, 5, 289, 49, 0, 239, 42, 240, 0, 45, 315 43, 46, 241, 42, 0, 0, 0, 43, 0, 0, 316 48, 0, 0, 0, 49, 0, 5, 42, 0, 0, 317 0, 43, 44, 5, 45, 0, 46, 47, 0, 44, 318 0, 0, 0, 46, 47, 48, 102, 5, 102, 49, 319 103, 239, 103, 240, 0, 0, 49, 46, 241, 0, 320 0, 0, 0, 0, 0, 0, 5, 0, 5, 0, 321 49, 0, 0, 0, 45, 0, 45, 0, 0, 0, 322 0, 383, 0, 81, 0, 48, 0, 48, 82, 107, 323 83, 107, 0, 84, 0, 0, 85, 0, 86, 87, 324 0, 0, 0, 88, 0, 89, 0, 0, 0, 0, 325 90 326 }; 327 328 static const yytype_int16 yycheck[] = 329 { 330 1, 11, 4, 145, 231, 170, 63, 246, 14, 10, 331 231, 296, 154, 247, 267, 9, 21, 6, 19, 21, 332 157, 131, 28, 24, 36, 136, 305, 306, 29, 136, 333 56, 32, 44, 9, 9, 36, 37, 9, 27, 40, 334 18, 9, 242, 44, 56, 54, 47, 165, 50, 48, 335 303, 63, 9, 62, 27, 56, 5, 10, 16, 169, 336 54, 171, 63, 65, 9, 14, 67, 68, 70, 0, 337 127, 73, 98, 49, 76, 77, 54, 4, 53, 91, 338 92, 53, 31, 18, 369, 53, 98, 40, 54, 14, 339 91, 92, 49, 303, 373, 305, 306, 98, 99, 299, 340 33, 340, 60, 104, 49, 339, 31, 108, 20, 110, 341 22, 112, 114, 366, 63, 127, 395, 30, 45, 54, 342 11, 239, 240, 10, 51, 11, 127, 128, 55, 14, 343 131, 61, 385, 145, 3, 136, 148, 19, 63, 304, 344 282, 27, 154, 12, 145, 157, 283, 148, 149, 151, 345 268, 104, 270, 154, 272, 265, 157, 267, 379, 296, 346 64, 167, 163, 373, 50, 166, 19, 36, 169, 280, 347 171, 398, 229, 280, 18, 128, 18, 398, 36, 8, 348 9, 8, 9, 136, 302, 395, 44, 56, 57, 47, 349 200, 8, 9, 303, 8, 305, 306, 307, 56, 53, 350 54, 202, 203, 23, 206, 23, 17, 18, 58, 27, 351 54, 44, 54, 218, 35, 333, 334, 229, 33, 33, 352 41, 53, 33, 360, 361, 46, 363, 47, 229, 47, 353 231, 31, 369, 91, 92, 40, 354, 238, 356, 357, 354 98, 99, 20, 54, 22, 9, 64, 8, 9, 13, 355 203, 62, 30, 40, 372, 15, 366, 15, 263, 8, 356 9, 8, 9, 373, 265, 18, 267, 8, 269, 8, 357 282, 283, 390, 53, 54, 385, 8, 278, 40, 280, 358 5, 282, 283, 284, 296, 395, 291, 58, 40, 40, 359 33, 59, 13, 15, 6, 296, 40, 53, 18, 11, 360 8, 15, 303, 33, 305, 306, 307, 17, 313, 21, 361 322, 316, 18, 25, 8, 27, 28, 8, 319, 53, 362 13, 322, 327, 325, 53, 29, 18, 280, 44, 92, 363 99, 336, 44, 112, 91, 337, 47, 37, 7, 105, 364 52, 282, 11, 322, 154, 379, 361, 363, 360, 361, 365 284, 363, 6, 65, 66, 128, 138, 369, 27, 360, 366 361, 74, 363, 280, 33, 366, 35, 21, 369, 134, 367 238, 25, 373, 27, 28, 169, 4, 46, 379, 7, 368 139, 50, 69, 11, 385, 265, 265, 354, 254, 391, 369 44, 356, 369, 298, 395, 297, 241, 398, 52, 27, 370 7, 300, -1, 246, 11, 33, -1, 35, -1, 333, 371 -1, 65, 66, -1, -1, 43, -1, 45, 46, -1, 372 27, 7, 50, 51, 31, 11, 33, 55, 35, -1, 373 37, 38, -1, -1, -1, 63, -1, -1, -1, 46, 374 -1, 27, 49, 50, -1, 31, 7, 33, -1, 35, 375 11, 37, 38, 7, -1, -1, -1, 11, -1, -1, 376 46, -1, -1, -1, 50, -1, 27, 7, -1, -1, 377 -1, 11, 33, 27, 35, -1, 37, 38, -1, 33, 378 -1, -1, -1, 37, 38, 46, 7, 27, 7, 50, 379 11, 31, 11, 33, -1, -1, 50, 37, 38, -1, 380 -1, -1, -1, -1, -1, -1, 27, -1, 27, -1, 381 50, -1, -1, -1, 35, -1, 35, -1, -1, -1, 382 -1, 42, -1, 19, -1, 46, -1, 46, 24, 50, 383 26, 50, -1, 29, -1, -1, 32, -1, 34, 35, 384 -1, -1, -1, 39, -1, 41, -1, -1, -1, -1, 385 46 386 };

1 #define PRIME 211 2 #define SUBPROC_NUM 100 3 #define EOS '\0' 4 5 typedef struct idnode{ 6 char *name; 7 int type; /*類型,如int、int*等*/ 8 int offset; 9 struct idnode *next_hash; /*指向下一節點的指針*/ 10 }Identifier; 11 12 typedef struct{ 13 char *name; 14 struct symtable* s; 15 }subproc; 16 17 typedef struct symtable{ 18 struct symtable* before; 19 int width; 20 Identifier *SymbolTable[PRIME]; //哈希表,存放變量 21 subproc* psubproc_array[SUBPROC_NUM]; 22 int subprocptr; 23 }symtbl; 24 25 int hashpjw(char *s) 26 { 27 char *p; 28 unsigned h = 0,g; 29 for(p = s;*p!=EOS;p=p+1) 30 { 31 h = (h<<4) + (*p); 32 if((g = (h & 0xF0000000))) 33 { 34 h = h^(g>>24); 35 h = h^g; 36 } 37 } 38 return h % PRIME; 39 } 40 41 symtbl *mktable(symtbl *bt) 42 { 43 int i; 44 symtbl* st = (symtbl*)malloc(sizeof(symtbl)); 45 st->before = bt; 46 st->subprocptr = 0; 47 for(i = 0;i < PRIME;i++) 48 { 49 st->SymbolTable[i] = NULL; 50 } 51 return st; 52 } 53 54 void addwidth(symtbl *st,int offset) 55 { 56 st->width = offset; 57 } 58 59 int enter(symtbl *st,char *name,int type,int offset) 60 { 61 int index; 62 Identifier *entry = (Identifier*)malloc(sizeof(Identifier)),*p,*pb; 63 entry->name = name; 64 entry->type = type; 65 entry->offset = offset; 66 index = hashpjw(name); 67 68 p = st->SymbolTable[index]; 69 70 if(p == NULL||strcmp(p->name,name)>0) 71 { 72 entry->next_hash = p; 73 st->SymbolTable[index] = entry; 74 return 0; 75 } 76 77 while(p != NULL) 78 { 79 if(strcmp(p->name,name) < 0) 80 { 81 pb = p; 82 p = p->next_hash; 83 } 84 else 85 { 86 break; 87 } 88 } 89 90 if(p == NULL) 91 { 92 entry->next_hash = NULL; 93 pb->next_hash = entry; 94 return 0; 95 } 96 else if(strcmp(p->name,name)>0) 97 { 98 entry->next_hash = p; 99 pb->next_hash = entry; 100 return 0; 101 } 102 else 103 { 104 /*出錯處理,重名了*/ 105 /*return p->firline;*/ 106 return 1; 107 } 108 } 109 110 void enterproc(symtbl *st,char *name,symtbl *t) //在st中添加子程序條目 111 { 112 subproc* sproc = (subproc*)malloc(sizeof(subproc)); 113 sproc->name = name; 114 sproc->s = t; 115 st->psubproc_array[st->subprocptr] = sproc; 116 }

1 (25,0) 2 (36,SumAverage) 3 (58,0) 4 (5,0) 5 (36,NumberOfIntegers) 6 (44,0) 7 (37,3) 8 (58,0) 9 (33,0) 10 (36,A) 11 (52,0) 12 (36,B) 13 (52,0) 14 (36,C) 15 (52,0) 16 (36,D) 17 (52,0) 18 (36,E) 19 (56,0) 20 (36,integer) 21 (58,0) 22 (36,Sum) 23 (56,0) 24 (36,integer) 25 (58,0) 26 (36,Average) 27 (52,0) 28 (36,t) 29 (56,0) 30 (36,real) 31 (58,0) 32 (3,0) 33 (36,A) 34 (57,0) 35 (37,45) 36 (58,0) 37 (36,B) 38 (57,0) 39 (37,7) 40 (58,0) 41 (36,C) 42 (57,0) 43 (37,68) 44 (58,0) 45 (36,D) 46 (57,0) 47 (37,2) 48 (58,0) 49 (36,E) 50 (57,0) 51 (37,34) 52 (58,0) 53 (36,Sum) 54 (57,0) 55 (36,A) 56 (40,0) 57 (36,B) 58 (40,0) 59 (36,C) 60 (58,0) 61 (36,Average) 62 (57,0) 63 (36,Sum) 64 (43,0) 65 (36,NumberOfIntegers) 66 (58,0) 67 (36,t) 68 (57,0) 69 (38,1120.000000) 70 (58,0) 71 (36,writeln) 72 (50,0) 73 (39,'Number of integers = ') 74 (52,0) 75 (36,NumberOfIntegers) 76 (51,0) 77 (58,0) 78 (36,writeln) 79 (50,0) 80 (39,'Number1 = ') 81 (52,0) 82 (36,A) 83 (51,0) 84 (58,0) 85 (36,writeln) 86 (50,0) 87 (39,'Number2 = ') 88 (52,0) 89 (36,B) 90 (51,0) 91 (58,0) 92 (36,writeln) 93 (50,0) 94 (39,'Number3 = ') 95 (52,0) 96 (36,C) 97 (51,0) 98 (58,0) 99 (36,writeln) 100 (50,0) 101 (39,'Number4 = ') 102 (52,0) 103 (36,D) 104 (51,0) 105 (58,0) 106 (36,writeln) 107 (50,0) 108 (39,'Number5 = ') 109 (52,0) 110 (36,E) 111 (51,0) 112 (58,0) 113 (36,writeln) 114 (50,0) 115 (39,'Sum = ') 116 (52,0) 117 (36,Sum) 118 (51,0) 119 (58,0) 120 (36,writeln) 121 (50,0) 122 (39,'Average = ') 123 (52,0) 124 (36,Average) 125 (51,0) 126 (10,0) 127 (54,0)
二、支持的產生式(見yacc.y)

1 %{ 2 /* 3 * grammar.y 4 * 5 * Pascal grammar in Yacc format, based originally on BNF given 6 * in "Standard Pascal -- User Reference Manual", by Doug Cooper. 7 * This in turn is the BNF given by the ANSI and ISO Pascal standards, 8 * and so, is PUBLIC DOMAIN. The grammar is for ISO Level 0 Pascal. 9 * The grammar has been massaged somewhat to make it LALR, and added 10 * the following extensions. 11 * 12 * constant expressions 13 * otherwise statement in a case 14 * productions to correctly match else's with if's 15 * beginnings of a separate compilation facility 16 */ 17 18 %} 19 20 %token AND ARRAY ASSIGNMENT CASE CHARACTER_STRING COLON COMMA CONST DIGSEQ 21 %token DIV DO DOT DOTDOT DOWNTO ELSE END EQUAL EXTERNAL FOR FORWARD FUNCTION 22 %token GE GOTO GT IDENTIFIER IF IN LABEL LBRAC LE LPAREN LT MINUS MOD NIL NOT 23 %token NOTEQUAL OF OR OTHERWISE PACKED PBEGIN PFILE PLUS PROCEDURE PROGRAM RBRAC 24 %token REALNUMBER RECORD REPEAT RPAREN SEMICOLON SET SLASH STAR STARSTAR THEN 25 %token TO TYPE UNTIL UPARROW VAR WHILE WITH 26 27 %% 28 file : program 29 ; 30 31 program : program_heading semicolon muldec_m1 block DOT 32 ; 33 34 muldec_m1 : 35 ; 36 37 program_heading : PROGRAM identifier 38 ; 39 40 identifier_list : identifier_list comma identifier 41 | identifier 42 ; 43 44 block : variable_declaration_part 45 procedure_and_function_declaration_part 46 statement_part 47 ; 48 49 constant : non_string 50 | sign non_string 51 ; 52 53 sign : PLUS 54 | MINUS 55 ; 56 57 non_string : DIGSEQ 58 ; 59 60 type_denoter : identifier 61 | new_type 62 ; 63 64 new_type : new_structured_type 65 ; 66 67 new_ordinal_type : subrange_type 68 ; 69 70 subrange_type : constant DOTDOT constant 71 ; 72 73 new_structured_type : structured_type 74 ; 75 76 structured_type : array_type 77 ; 78 79 array_type : ARRAY LBRAC index_list RBRAC OF component_type 80 ; 81 82 index_list : index_list comma index_type 83 | index_type 84 ; 85 86 index_type : ordinal_type ; 87 88 ordinal_type : new_ordinal_type 89 ; 90 91 component_type : type_denoter ; 92 93 variable_declaration_part : VAR variable_declaration_list semicolon 94 | 95 ; 96 97 variable_declaration_list : 98 variable_declaration_list semicolon variable_declaration 99 | variable_declaration 100 ; 101 102 variable_declaration : identifier_list COLON type_denoter 103 ; 104 105 procedure_and_function_declaration_part : 106 proc_or_func_declaration_list semicolon 107 | 108 ; 109 110 proc_or_func_declaration_list : 111 proc_or_func_declaration_list semicolon proc_or_func_declaration 112 | proc_or_func_declaration 113 ; 114 115 proc_or_func_declaration : procedure_declaration 116 ; 117 118 procedure_declaration : procedure_heading semicolon muldec_m2 procedure_block 119 ; 120 121 muldec_m2 : 122 ; 123 124 procedure_heading : procedure_identification 125 | procedure_identification formal_parameter_list 126 ; 127 128 formal_parameter_list : LPAREN formal_parameter_section_list RPAREN ; 129 130 formal_parameter_section_list : formal_parameter_section_list semicolon formal_parameter_section 131 | formal_parameter_section 132 ; 133 134 formal_parameter_section : value_parameter_specification 135 | variable_parameter_specification 136 ; 137 138 value_parameter_specification : identifier_list COLON identifier 139 ; 140 141 variable_parameter_specification : VAR identifier_list COLON identifier 142 ; 143 144 procedure_identification : PROCEDURE identifier ; 145 146 procedure_block : block ; 147 148 statement_part : compound_statement ; 149 150 compound_statement : PBEGIN statement_sequence END ; 151 152 statement_sequence : statement_sequence semicolon ctrl_m statement 153 | statement 154 ; 155 156 statement : open_statement 157 | closed_statement 158 ; 159 160 open_statement : non_labeled_open_statement 161 ; 162 163 closed_statement : non_labeled_closed_statement 164 ; 165 166 non_labeled_closed_statement : assignment_statement 167 | procedure_statement 168 | compound_statement 169 | repeat_statement 170 | closed_if_statement 171 | closed_while_statement 172 | closed_for_statement 173 | 174 ; 175 176 non_labeled_open_statement : open_if_statement 177 | open_while_statement 178 | open_for_statement 179 ; 180 181 repeat_statement : REPEAT ctrl_m statement_sequence UNTIL repeat_n boolean_expression 182 ; 183 184 open_while_statement : WHILE ctrl_m boolean_expression DO ctrl_m open_statement 185 ; 186 187 closed_while_statement : WHILE ctrl_m boolean_expression DO ctrl_m closed_statement 188 ; 189 190 open_for_statement : FOR control_variable ASSIGNMENT initial_value direction 191 final_value DO for_m open_statement 192 ; 193 194 closed_for_statement : FOR control_variable ASSIGNMENT initial_value direction 195 final_value DO for_m closed_statement 196 ; 197 198 open_if_statement : IF boolean_expression THEN ctrl_m statement 199 | IF boolean_expression THEN ctrl_m closed_statement ctrl_n ELSE ctrl_m open_statement 200 ; 201 202 closed_if_statement : IF boolean_expression THEN ctrl_m closed_statement ctrl_n 203 ELSE ctrl_m closed_statement 204 ; 205 206 assignment_statement : variable_access ASSIGNMENT expression 207 ; 208 209 variable_access : identifier 210 | indexed_variable 211 ; 212 213 indexed_variable : index_expression_list RBRAC 214 ; 215 216 index_expression_list : index_expression_list comma index_expression 217 | identifier LBRAC index_expression 218 ; 219 220 index_expression : expression ; 221 222 procedure_statement : identifier params 223 | identifier 224 ; 225 226 params : LPAREN actual_parameter_list RPAREN ; 227 228 actual_parameter_list : actual_parameter_list comma actual_parameter 229 | actual_parameter 230 ; 231 232 /* 233 * this forces you to check all this to be sure that only write and 234 * writeln use the 2nd and 3rd forms, you really can't do it easily in 235 * the grammar, especially since write and writeln aren't reserved 236 */ 237 actual_parameter : expression 238 ; 239 240 control_variable : identifier ; 241 242 initial_value : expression ; 243 244 direction : TO 245 | DOWNTO 246 ; 247 248 final_value : expression ; 249 250 boolean_expression : expression ; 251 252 expression : simple_expression 253 | simple_expression relop simple_expression 254 ; 255 256 simple_expression : term 257 | simple_expression addop boolean_m term 258 ; 259 260 term : factor 261 | term mulop boolean_m factor 262 ; 263 264 factor : sign factor 265 | exponentiation 266 ; 267 268 exponentiation : primary 269 ; 270 271 primary : variable_access 272 | unsigned_constant 273 | LPAREN expression RPAREN 274 | NOT primary 275 ; 276 277 unsigned_constant : unsigned_number 278 | CHARACTER_STRING 279 ; 280 281 unsigned_number : unsigned_integer | unsigned_real ; 282 283 unsigned_integer : DIGSEQ 284 ; 285 286 unsigned_real : REALNUMBER 287 ; 288 289 addop: PLUS 290 | MINUS 291 | OR 292 ; 293 294 mulop : STAR 295 | SLASH 296 | DIV 297 | MOD 298 | AND 299 ; 300 301 relop : EQUAL 302 | NOTEQUAL 303 | LT 304 | GT 305 | LE 306 | GE 307 ; 308 309 identifier : IDENTIFIER 310 ; 311 312 semicolon : SEMICOLON 313 ; 314 315 comma : COMMA 316 ; 317 318 boolean_m : 319 ; 320 321 ctrl_m: 322 ; 323 324 ctrl_n: 325 ; 326 327 repeat_n: 328 ; 329 330 for_m: 331 ;
三、預測分析表使用bison生成,參考文章《Understanding C parsers generated by GNU Bison》歸納總結https://www.cs.uic.edu/~spopuri/cparser.html
table.h中各表含義如下:
yytranslate[] 建立詞法分析器生成的token編號與語法分析器中終結符編號的映射
yytranslante[toke編號] = 語法分析器中此token的終結符編號
特別地,固定yytranslate[0] = 0
Yytname 存放各終結符與非終結符名字,yytname[符號編號]=符號名字,它對語法分析器的
正確性沒有什么實質性意義,主要是方便debug時打印符號棧和產生式
yyr1 存放產生式的左部
yyr2 存放產生式右部的長度
yydefact 某狀態時的默認規約式(0為出錯),yydefact[狀態號]=此狀態默認使用的產生式號
yydefgoto 非終結符對應的狀態轉換,yydefgoto[非終結符號]=默認要被壓入棧中的狀態
yypact 最先被查的表,其值會被加到符號編號上,結果去索引yytable
yypgoto goto動作時最先被查的表,其值會被加到狀態號上,結果去索引yytable
yytable 被索引的表,-1為出錯,>0為移進,<0為規約,=0為按yydefact的產生式號規約
yycheck 檢查表,每次在查yytable前先使用此表進行檢查
使用bison生成的預測好處在於它並不像傳統的預測分析表一樣存儲一個很大的稀疏矩陣,這樣做很浪費空間,它生成幾個更小的線性一維數組。它生成的表並不是所有的都有用,有用的表其實只有上面介紹的這些,其他表用於打印調試信息和進行錯誤恢復,比如yytname表。
具體例子如下:
1、移進與規約的選擇
狀態棧 符號棧 式子
0 # a……
假設a的編號為5
①yypact[0] = -4 + 5(‘a’) = 1
②yycheck[1]=5? 是③,否④
③按yytable[1]的動作執行
④按yydefact[0]的動作執行
2、goto動作時被壓入狀態棧的狀態確定
假設當前符號棧棧頂為p,狀態棧棧頂為10
①yypgoto[p]=2 + 10(state number)=12
②yycheck[12]=10? 是③,否④
③壓棧yytable[12]的值
④壓棧yydefgoto[p]
四、部分結果截圖(總體程序中不會打印此部分)
輸出為:狀態棧&符號棧(&使用的產生式)