简单的字符串通过Bison / Yacc中的节点

时间:2012-01-19 19:45:53

标签: c++ string bison yacc stringstream

我必须在yacc文件的语义规则中连接字符串:

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

---

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

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

但是,由于联盟中不允许stringstream甚至string,我找不到任何简单的方法来混合char *int,并使节点传输一个我可以随处操作的字符串。 我该怎么办?

2 个答案:

答案 0 :(得分:2)

我不记得bison / yacc详细信息,但您确定可以使用指针和new。如果delete / bison为您提供机会,请记住yacc

答案 1 :(得分:0)

实际上并不是很难跟踪指针。例如:

%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>