一、语法分析器的工作流程为:每次从词法分析器产生的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

相关文章:

  • 2022-02-08
  • 2021-12-02
  • 2021-07-15
  • 2022-12-23
  • 2022-12-23
  • 2021-07-03
  • 2021-07-22
  • 2021-08-21
猜你喜欢
  • 2021-05-17
  • 2022-12-23
  • 2021-08-26
  • 2022-12-23
  • 2022-12-23
  • 2021-10-27
相关资源
相似解决方案