1) Do not embed code in the grammar as you will end up with an unreadable mess (see many other posts about this); 2) Don't use $text unless what you are doing is trivial, but remember that the $text items are released once you free the parser (see many other posts about this); 3) Don't use 'literals', use tokens defined in the lexer (see many other posts about this); 4) However, that is not your problem, download and run valgrind, which will tell you what you are doing wrong - this is a programming issue, not an antlr issue;
http://antlr.markmail.org http://valgrind.org/ You might be better just putting this code in a main.c program and taking antlr out of the equation. When you can just set the list you will see what you are doing wrong. Jim > -----Original Message----- > From: [email protected] [mailto:antlr-interest- > [email protected]] On Behalf Of Christian Benjamin Ries > Sent: Friday, October 15, 2010 2:05 AM > To: [email protected] > Subject: [antlr-interest] C++ Map not usable, always SEGFAULT > > Hello, I'm a little bit frustated. > > I'm trying to use a C++ Map with ANTLR, but I get a segfault always. > > The source is pasted below, any suggestions? > > The output is always: > -- > c...@....:~/dsl/output$ ./dsl ../install1.host_dsl > NetIP: 127.0.0.1 > hlist size: 0 > Segmentation fault > -- > > 1. Snippet - class Host with Map: > ---- 1. START > class Host { > private: > Network network; > Distribution distribution; > public: > Host(); > Host(const Host& host); > ~Host(); > void setNetwork(Network network) { this->network = network; } > Network & getNetwork() { return this->network; } > void setDistribution(Distribution distri) { this->distribution = distri; } > Distribution & getDistribution() { return this->distribution; } }; struct > HostMapCompare { > bool operator()( const char* s1, const char* s2 ) const { > return strcmp( s1, s2 ) < 0; > } > }; > typedef std::map<const char*, Host, HostMapCompare> HostList; typedef > std::map<const char*, Host, HostMapCompare>::iterator HostListIterator; > ---- 1. END > > ---- 2. START > cluster : > host* > ; > ---- 2. END > > ---- 3. START > host > scope Symbols; > @init { > $Symbols::name->custom = new std::string(); > $Symbols::name->freeCustom = freeName; > } > : 'Host' n=STRING { > $Symbols::name->custom = $n.text->chars; > } > OPEN_BRACE > host_values[$Symbols::name] > CLOSE_BRACE > ; > > host_values[pANTLR3_COMMON_TOKEN hostname] > @init { > std::string hostid; > Network network; > } > : { > hostid = (char*)hostname->custom; > hostid = hostid.substr(1,hostid.length()-2); > } > ( > 'distribution' ':' DISTRIBUTION END > | 'netip' ':' a=IP {network.setNetIp((char*)$a.text->chars);} END > | 'netgw' ':' b=IP {network.setNetGw((char*)$b.text->chars);} END > | 'netns' ':' c=IP {network.setNetNs((char*)$c.text->chars);} END > | 'netnm' ':' d=IP {network.setNetNm((char*)$d.text->chars);} END > | 'nethn' ':' STRING {network.setNetHn((char*)$STRING.text->chars);} > END > )* > 'services' ':' (ID|service) ((',' ID)|service)* END { > VisualGrid::Host h; > h.setNetwork(network); > std::cout << "NetIP: " << h.getNetwork().getNetIp() << std::endl; > std::cout << "hlist size: " << hlist.size() << std::endl; > hlist[hostid.c_str()] = h; // COULD NOT SET?!?!?!?!? > std::cout << "hlist size: " << hlist.size() << std::endl; > } > ; > ---- 3. END > > -- > ========================================================== > ================================== > Dipl.-Ing. (FH) Christian Benjamin Ries > University of Applied Sciences Bielefeld Department of Engineering Sciences > and Mathematics CMSE - Computational Materials Science& Engineering > > Wilhelm-Bertelsmann-Str. 10 > D-33602 Bielefeld > Office: 202 (WBS II) > Phone: +49 521 106-71222 > Fax: +49 521 106-71241 > http://www.christianbenjaminries.de > ========================================================== > ================================== > > > > List: http://www.antlr.org/mailman/listinfo/antlr-interest > Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your- > email-address List: http://www.antlr.org/mailman/listinfo/antlr-interest Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address -- You received this message because you are subscribed to the Google Groups "il-antlr-interest" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/il-antlr-interest?hl=en.
