Chinese Yellow Pages | Classifieds | Knowledge | Tax | IME

Recently I spent some time to write a DSL ( domain specific Language) lexer and parser.

Without double flex, bison (C++) will be used.  Bison ( version 3.0.2/3.04) generally support C++ object as the semantics value.  That is a good thing  since we do not need  %destructor  to enable memory deallocation during error recovery; the memory, for strings for instance, will be reclaimed by the regular destructors.

But when we want to create a large C++ object while parsing, we want to pass pointers instead of copying object. The raw new/delete is urgly,  thus naturally we want to use std::unique_ptr as the semantics value. Since std::unique_ptr is a object, bison C++ should support it, right?

It turned out that Bison 3.0.3/3.0.4 does not support well using std::unqiue_ptr as semantic value.  It can not even compile,  it need one hack!  we need to  replace one line with std::move, thanks  Sasah ( from bison mailing list)! !

— file.hh
+++ file.hh
@@ -178 +178 @@
– return *new (yyas_<T> ()) T (t);
+ return *new (yyas_<T> ()) T (std::move((T&)t));

we can use sed to replace it: sed -i ‘s/return \*new (yyas_<T> ()) T (t)/return \*new (yyas_<T> ()) T (std\:\:move((T\&)t))/’ your_file.hh

Now it compiles, and the parser works.

More details can be see at:

http://lists.gnu.org/archive/html/help-bison/2016-08/msg00014.html
http://lists.gnu.org/archive/html/bug-bison/2016-08/msg00006.html.

 

Hopefully in the future bison will officially support the std::unique_ptr!

 

Leave a Reply

Your email address will not be published. Required fields are marked *