任何减少boost :: spirit编译时间的想法?
我刚刚将flex解析器移植到boost :: spirit.EBNF有大约25条规则.
结果运行良好,运行时性能良好.
问题是编译需要永远!它需要大约十分钟,并且需要几乎一千兆字节的内存.原始的flex解析器在几秒钟内编译完成.
我正在使用boost版本1.44.0和Visual Studio 2008.
在Joel de Guzman的文章"最佳实践"中,它说
具有复杂定义的规则严重损害了编译器.我们已经看到超过一百行的规则,需要花费几分钟来编译
好吧,我没有接近那么久,但我的编译仍然需要超过几分钟
这是我语法中最复杂的部分.它是以某种方式分解成较小部分的候选者吗?
rule
= ( tok.if_ >> condition >> tok.then_ >> *sequel ) [ bind( &cRuleKit::AddRule, &myRulekit ) ]
| ( tok.if_ >> condition >> tok.and_ >> condition >> tok.then_ >> *sequel ) [ bind( &cRuleKit::AddRule, &myRulekit ) ]
;
condition
= ( tok.identifier >> tok.oper_ >> tok.value ) [ bind( &cRuleKit::AddCondition, &myRulekit, _pass, _1, _2, _3 ) ]
| ( tok.identifier >> …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个Bison解析器来处理UTF-8字符.我不希望解析器实际解释Unicode字符值,但我希望它将UTF-8字符串解析为字节序列.
现在,Bison生成以下代码,这是有问题的:
if (yychar <= YYEOF)
{
yychar = yytoken = YYEOF;
YYDPRINTF ((stderr, "Now at end of input.\n"));
}
Run Code Online (Sandbox Code Playgroud)
问题是UTF-8字符串的许多字节将具有负值,并且Bison将负值解释为EOF,并停止.
有没有解决的办法?