From: Olly B. <ol...@su...> - 2009-07-31 11:20:27
|
On 2009-07-30, Matevž Jekovec <mat...@gm...> wrote: > I'm looking at mem_initializer node in parser.y. Is there a reason why > we Skip_balanced the () and not simply put > mem_initializer : idcolon LPAREN parms RPAREN {} That wouldn't work - this is the member initialisation in a constructor, e.g.: Foo::Foo() : a(1), b(foo(7) + 9) { } ^^^^ ^^^^^^^^^^^^^ These two are examples of mem_initializer. You might be able to replace parms with something like valexpr, though this can also be empty - if c is a std::string, you can say c() here. I suspect the reason why we just skip matching () here is that we don't need to understand the code in there to generate wrappers, so it's simpler to just skip it, and it means there's no risk of there being some expression in there which we aren't capable of fully parsing (I think SWIG only needs to be able to actually parse constant expressions). One esoteric example is the GCC statement expression extension: Foo::Foo() : a(1), b( ({ int x = 3; while (x < 100) { x = x * x; } x; }) ) { } > I'm asking becasue I added support (C++0x) for curly brackets and three > dots. Now it looks like: > mem_initializer : idcolon LPAREN parms RPAREN {} > | idcolon LBRACKET parms RBRACKET {} > | idcolon LPAREN parms RPAREN PERIOD PERIOD PERIOD {} > | idcolon LBRACKET parms RBRACKET PERIOD PERIOD PERIOD {} LBRACKET is "[" - for curly brackets you want LBRACE... I'd suggest that you try adding an alternative for mem_initializer to handle the alternative syntax using curly brackets: | idcolon LBRACE { skip_balanced('{', '}'); Clear(scanner_ccode); } And then handle PERIOD PERIOD PERIOD in mem_initializer_list: mem_initializer | mem_initializer PERIOD PERIOD PERIOD | mem_initializer_list COMMA mem_initializer | mem_initializer_list COMMA mem_initializer PERIOD PERIOD PERIOD Cheers, Olly |