Я пытаюсь воспроизвести, как cout работает с использованием flex и bison. Например:Bison печатает мой пользовательский cout назад
cout << "hello world";
напечатает:
hello world
Это работает прекрасно, когда есть только один параметр, но у меня есть проблема, когда я ставлю несколько переменных.
cout << "I like " << "bananas" << endl;
напечатает
\nbananasI like
вместо
I like bananas\n
Я думаю, что это потому, что он анализирует всю линию перед печатью, так что начинается с «End L,» затем «бананы», а затем «Мне нравится», но я не понимаю, как это сделать. Я попытался изменить свой токен в нескольких настройках, чтобы отменить приоритет, например, для умножения и добавления, но пока не добился успеха.
Эти полезные части myfile.y
%union {
char* string;
}
%token <string> STRING
%token ENDL
%token COUT
%token INSERT
%%
displayBegin :
COUT displayContent
;
displayContent :
';'
| INSERT displayEnd
| INSERT STRING displayContent { printf("%s",$2); }
;
displayEnd :
ENDL ';' { printf("\n"); }
;
%%
Одинаковые для myfile.l
"cout" { return COUT; }
"endl" { return ENDL; }
"<<" { return INSERT; }
[\"][^\"]+[\"] { char* tmp = strdup(yytext); tmp++; tmp[strlen(tmp)-1] = '\0'; yylval.string = tmp; return STRING; }
Я отредактированные myfile.y, как следовать, и он работает, но, как это дважды рекурсивный это не так здорово (показывает предупреждение во время компиляции):
displayBegin :
COUT INSERT displayContent
;
displayContent :
';'
| displayEnd
| STRING { printf("%s",$1); }
| displayContent INSERT displayContent
;
О, да, я вижу. Однако я не вижу, как разбирать его по-разному. Я сделал это «двойной рекурсивный» ('displayContent INSERT displayContent'), как я делаю свои операции, и он отображает правильно, но из-за этого он отображает предупреждение (сдвиг/уменьшение). Это лучше, на мой взгляд, так как это работает, но я хотел бы заставить его работать без предупреждения. – Ananas
Нет необходимости разбирать его по-разному. Например, вы можете распечатать все это, как только вы закончите синтаксический анализ всего (в правиле 'displayBegin') – Eduardo