Почему yytext пропускает первый ввод в YACC? - PullRequest
0 голосов
/ 26 апреля 2019

Я работал с примером проблемы, чтобы создать трехадресный код для выражения.Но, к моему удивлению, YACC, похоже, пропустил мой первый символ ввода.Я приложу изображение с выводом, чтобы прояснить его.

Правила не слишком сложны, поэтому я не понимаю, в чем проблема.

Вот мой файл lex:

%{
#include"y.tab.h"
%}
%%
[a-zA-Z]+ return ID;
[0-9]+ return NUM;
. return yytext[0];
%%
int yywrap(){return 1;}

Вот мой файл yacc:

%{
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char st[50][50];
extern char * yytext;
int top=-1;char t[5]="0";char temp[5];
void push();
void code();
%}
%token NUM ID
%left '+' '-'
%left '*' '/'
%%
S:' 'E
|' 'A'='E
;
A:ID{push();printf("yytext is %s\n",yytext);}
;
E:E'+'{push();}T{code();}
|E'-'{push();}T{code();}
|T
;
T:T'*'{push();}F{code();}
|T'/'{push();}F{code();}
|F
;
F:ID{push();}
|NUM{push();}
;
%%
void push(){strcpy(st[++top],yytext);}

void code(){
strcpy(temp,"t");
strcat(temp,t);
t[0]++;
printf("%s = %s %s %s \n",temp,st[top-2],st[top-1],st[top]);
top=top-2;
strcpy(st[top],temp);

}

int main(){yyparse();}
int yyerror(){exit(0);}

Я ожидаю, что при печати в A: ID будет напечатан введенный идентификатор, но вместо этого будет напечатан '=',вот мой вывод: мой вывод

1 Ответ

0 голосов
/ 26 апреля 2019

Чтобы быть уверенным, что A было замечено, yacc должен был продвинуться (смотреть вперед), чтобы увидеть =.Это переписывает ваш первый токен в yytext.

...