我必须在yacc文件的语义规则中连接字符串:
%union {
stringstream sstream;
}
%type<sstream> node1 node2
---
node1
: node2 { $$ << $1 << " goodbye" }
node2
: final { $$ << "hello" }
但是,由于联盟中不允许stringstream
甚至string
,我找不到任何简单的方法来混合char *
,int
,并使节点传输一个我可以随处操作的字符串。
我该怎么办?
答案 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>