語法分析器——哈工大編譯原理課程(二)


一、語法分析器的工作流程為:每次從詞法分析器產生的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 }
GrammarParser
 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 }
stack.h
  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 };
table.h
  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 }
symboltable.h
  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)
lex.txt

二、支持的產生式(見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 ;
yacc.y

三、預測分析表使用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]

四、部分結果截圖(總體程序中不會打印此部分)

輸出為:狀態棧&符號棧(&使用的產生式)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM