Простая строка, проходящая через узлы в Bison / Yacc - PullRequest
1 голос
/ 19 января 2012

Я должен объединить строки в семантических правилах моего файла yacc:

%union {
  stringstream sstream;
}
%type<sstream> node1 node2

---

node1
: node2 { $$ << $1 << " goodbye" }

node2
: final { $$ << "hello" }

Однако, поскольку stringstream или даже string недопустимы в объединениях, я не нахожу простого способа смешать char *, int и заставить узлы транспортировать строку, которой я могу манипулировать везде. Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 19 января 2012

Я не помню bison / yacc деталей, но вы точно можете использовать указатель и new его.Просто помните delete, если bison / yacc дает вам возможность.

0 голосов
/ 20 января 2012

На самом деле не так сложно следить за указателями. Например:

%union {
  stringstream *sstream;
}
%type<sstream> pair node1 node2 final

---

pair
: node1 ',' node1 { *($$ = $1) << ',' << *$3;  delete $3; }

node1
: node2 { *($$ = $1) << " goodbye" }

node2
: final { *($$ = $1) << "hello" }

final
: TOKEN { *($$ = new stringstream) << "TOKEN"; }

Одной из основных проблем является утечка, если в ваших входных данных есть синтаксические ошибки, из-за которых значения отбрасываются без выполнения ваших действий. Вы можете обойти эту проблему, используя расширение Bison %destructor. В этом случае вам нужно только добавить:

%destructor { delete $$; } <sstream>
...