Related articles |
---|
spirit giving error C1067 in VC++7 lu.nn@wischik.com (Lucian Wischik) (2003-02-06) |
Re: spirit giving error C1067 in VC++7 djowel@gmx.co.uk (Joel de Guzman) (2003-02-11) |
From: | Lucian Wischik <lu.nn@wischik.com> |
Newsgroups: | comp.compilers |
Date: | 6 Feb 2003 00:08:34 -0500 |
Organization: | University of Bologna |
Keywords: | parse, tools, question |
Posted-Date: | 06 Feb 2003 00:08:34 EST |
I'm trying to use Spirit in my VisualC++7 project. It worked fine at
first. But now that the grammar has got bigger, it fails every time
with an error "C1047 compiler limit: debug information module size
exceeded". Does anyone have any advice, please?
There are two causes for the message: either a symbol has a decorated
name exceeding 247 characters, or that a "particular item such as an
enum has exceeded the 64k limit on the size of its debug record - when
you put merge lots of enums together it's not uncommon to exceed this
limit". I don't know which is the cause. I suspect it's the latter,
since the addition of even a trivial rule is enough to trigger the
problem.
One thing I should do, I suppose, is break it up into separate "units"
of some kind. Except I'm completely new to Spirit (this is my second
day of using it) so I don't have an idea of what kind of
breakups-into-units it allows. Can anyone advise, please?
Thanks in advance for any help! I've included my grammar, below. (I've
already written the grammar in JavaCC, and also on Yacc, but abandoned
yacc because I couldn't figure out how to C++ify it and unicodify it
and make it reentrant and and all that.)
struct pi_parser : public grammar<pi_parser>
{ vector<Expr>& estack; vector<PiTerm>& tstack;
pi_parser(vector<Expr>& estack_, vector<PiTerm>& tstack_)
: estack(estack_), tstack(tstack_) {}
//
template <typename ScannerT> struct definition
{ definition(pi_parser const& self)
{ integer = int_p[push_const<int>(self.estack)];
real = real_p[push_const<double>(self.estack)];
string = confix_p('"', *c_escape_ch_p,'"')
[push_string(self.estack)];
boolean = str_p("true")[push_bool(self.estack,true)]
| str_p("false")[push_bool(self.estack,false)];
chan = lexeme_d[ (str_p("@@") >>
*(alnum_p | ':') >>
"@@")[push_chan(self.estack)] ];
id = lexeme_d[ (alpha_p
>> *(alnum_p | '_'))[push_var(self.estack)] ];
expr = integer | real | string | boolean | chan | id;
exprs = !(expr >> *(',' >> expr));
chanexpr = chan | id;
decl = (id >> id);
decls = !(decl >> *(',' >> decl));
snd = (chanexpr >> '.' >> str_p("snd") >>
!( '(' >> exprs >> ')'));
rcv = (chanexpr >> '.' >> str_p("rcv") >>
!( '(' >> decls >> ')'));
invoke = (chanexpr >> '(' >> exprs >> ')');
sched = (decl >> '(' >> !(decl >> *(','>>decl)) >> ')'
>> '{' >> prog >> '}');
prog = !(loose >> *('|' >> loose));
loose = tight >> *('+' >> tight);
tight = cmd >> *(';' >> cmd) >> !(str_p(";"));
cmd = snd | rcv>>'{'>>prog>>'}' | '{' >> prog >> '}'
| !(decl >> '=') >> invoke;
}
rule<ScannerT> id, chan, boolean, string, real, integer;
rule<ScannerT> expr, chanexpr, exprs, decl, decls;
rule<ScannerT> snd, rcv, invoke;
rule<ScannerT> prog, sched, loose, tight, cmd;
rule<ScannerT> const& start() const {return integer;}
};
};
--
Lucian Wischik, University of Bologna. www.wischik.com/lu
Return to the
comp.compilers page.
Search the
comp.compilers archives again.