Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

BISON, освобождение памяти при синтаксической ошибке. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ресайз картинки, хранимой в grayscale-матрице http://www.cyberforum.ru/cpp/thread281396.html
Здравствуйте, уважаемые! Возникла следующая задача: Есть множество двухмерных массивов произвольных размеров, хранящих в себе информацию о яркости точек изображения (по сути - просто grayscale...
C++ Сервер Помогите, я хочу создать сервер Властелин колец онлайн. Что для этого нужно и как это сделать, на каком языке писать, и в какой среде Добавлено через 27 минут Помогите, я хочу создать сервер... http://www.cyberforum.ru/cpp/thread280738.html
C++ Нужен исходник алгоритма SHA
Нужен исходник этого алгоритма. Ссылки на библиотеки мне не нужны, т.к. я ничего не понял как делать. Мне нужно просто - вызвал функцию, передал туда строку и функция вернула мне результат....
C++ Вывести изображение на экран (ручками)
Есть например картинка не важно в каком формате (самые легкие для считывание это наверно tga png bmp) каким образом надо залесть в этот файл с картинкой чтобы считать цвет пикселей и собственно их...
C++ Запуск программ по расписанию http://www.cyberforum.ru/cpp/thread280447.html
Нужно реализовать программу на Microsoft Visual C++ которая бы запускала программы по заданному времени. Я её реализовал под Win32 Aplication. Расписание время и путь программ я указывал в файл ...
C++ Как выделить определенный диапазон цвета RGB на картинке bmp? всем доброго времени суток!помогите,пожалуйста, в написании кода.есть картинка bmp. Надо разложить ее на цвета rgb. определить диапазон оттенка красного и выделить его на изображении... подробнее

Показать сообщение отдельно
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567

BISON, освобождение памяти при синтаксической ошибке. - C++

04.05.2011, 16:14. Просмотров 1037. Ответов 2
Метки (Все метки)

Здравствуйте. При работе с BISON, как освободить память выделенную под возвращаемые продукциями "объекты" в случае синтаксической ошибки? Все мануалы облазил (штук 5-6) не нашел ничего кроме описания зачем нужен токен error и yyerrok и все такое.
Вот составил пример, чтобы вопрос был ясен и было на чем показать. В нем надо как-то, в продукции line строка 36, освободить память, занятую деревом, если произошла ошибка разбора.
Код
/* Синтаксический анализатор для простых арифметических выражений.  */
%{
#include <stdio.h>
#include <stdlib.h>
#define YYDEBUG 1
static int yylex(void);
static int yyerror(char*);

float variable;

typedef struct tree {
  struct tree *left;
  struct tree *right;
  float val;
  int op;
} tree;
#define YYSTYPE tree*
tree *make_tree(tree *l, tree *r, float v, int o);
void print_tree(tree *t);
void free_tree(tree *t);
%}

%token NUM
%left '+' '-'
%left '/' '*'
%left UNARY
%left '('

%%
input:
    line                 { print_tree($1); free_tree($1); }
  | input line           { print_tree($2); free_tree($2); }
  ;
line:
    exp '\n'             { $$ = $1; }
  | error '\n'           { /* Тут надо освободить память. */ }
  ;
exp:
    prim
  | exp '+' exp          { $$ = make_tree($1, $3, 0, '+'); }
  | exp '-' exp          { $$ = make_tree($1, $3, 0, '-'); }
  | exp '*' exp          { $$ = make_tree($1, $3, 0, '*'); }
  | exp '/' exp          { $$ = make_tree($1, $3, 0, '/'); }
  ;
prim:
    '(' exp ')'          { $$ = $2; }
  | '-' prim %prec UNARY { $$ = make_tree($2, NULL, 0, 'u'); }
  | NUM                  { $$ = make_tree(NULL, NULL, variable, 'v'); }
  ;
%%
tree *make_tree(tree *l, tree *r, float v, int o)
{
  tree* t = (tree*)malloc(sizeof(tree));
  t->left = l;
  t->right = r;
  t->val = v;
  t->op = o;
  return t;
}
void print_tree(tree *t)
{
  static n = 0;
  if (t != NULL) {
    int i;
    for (i = 0; i < n; i++)
      printf(" ");
    switch(t->op) {
    case 'u': printf("- unary\n"); break;
    case 'v': printf("%f\n", t->val); break;
    default:
      printf("%c\n", t->op);
    }
    n++;
    print_tree(t->left);
    print_tree(t->right);
    n--;
  }
}
void free_tree(tree *t)
{
  if (t != NULL) {
    free_tree(t->left);
    free_tree(t->right);
    free(t);
  }
}
int yylex()
{
  int c;
  while (!feof(stdin) && (c = getc(stdin)) == ' ');
  if (feof(stdin)) return 0;
  switch (c) {
  case '+':
  case '-':
  case '*':
  case '/':
  case '(':
  case ')':
  case '\n':
        return c;
  default:
    break;
  }
  if (isdigit(c)) {
    ungetc(c, stdin);
    fscanf(stdin, "%f", &variable);
    return NUM;
  }
}

int yyerror(char *s)
{
  fprintf(stderr, "%s.\n", s);
  return 1;
}
int main()
{
  /* yydebug = 1; */
  return yyparse();
}
Единственная моя идея: сделать стек с указателями на узлы дерева, и при появлении токена error все эти указатели освобождать. Но это плохой вариант, слишком много лишнего кода. Пример выше - всего лишь пример, есть "реальная программа" для построения синтаксического дерева для исходника на C, и там время работы критично, мне кажется... Нет ли у BISON какого-нибудь "родного" способа освободить память? Собственным стеком бизона yyvs пользоваться не получается ошибка сегментирования или ноль реакции на print_tree и free_tree.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru