Ранее я уже просил помощи по Bison, и мне таки здорово помогли, за что большое спасибо всем, кто написал в тот тред. Теперь возникла новая проблема - мне надо сделать преобразование грамматики из прошлого примера в обратную польскую запись. Я нашёл пример RPN Calc на gnu.org, но от него пользы мало. Так и не понял, как же работать со строками в бизоне. Вот код:
%{ #define YYSTYPE char * #include <stdio.h> #include <ctype.h> #include <cstring> #include «bison.tab.hh» int yyparse(void); int yyerror (const char *s){} void yylex_reinitialize(void) { int c; while ( c != EOF && c != '\n' ) c = getchar(); } int yylex(void) { int c; while ( (c = getchar()) == ' ' || c == '\t' ); if (c == EOF || c == '\n') return 0; return c; } int main (void) { while (1) { if (!yyparse()) { printf(«Правильная строка\n»); } else { printf(«Ошибка: неправильная строка\n»); yylex_reinitialize(); } } } %} %token 'c' 'e' 'd' %% S: E { printf(«%s», $$); }; E: E'+'T { $$ = strcat($1, $3); $$ = strcat($$, $2); }; E: T; T: T'*'F { $$ = strcat($1, $3); $$ = strcat($$, $2); }; T: F; F: 'c'|'e'|'d'|'('E')'; %%Собственно, он компилируется, но выдаёт Segmentation fault. Подозреваю, что я где-то должен выделить память для $$ сначала.