Ранее я уже просил помощи по 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. Подозреваю, что я где-то должен выделить память для $$ сначала.