减少推动的任何想法:共同汇编时间?
我刚刚举出一个精彩的教区,以推进:阴谋。 EBNF大约有25条规则。
The result runs well and the runtime performance is fine.
问题是,汇编起来永远不会! 它需要约十分钟,需要几乎一千兆字的记忆。 最初的“法尔”编成几秒。
我正在使用1.44.0版和2008年视觉演播室。
In Joel de Guzman s article 最佳做法。
Rules with complex definitions hurt the compiler badly. We’ve seen rules that are more than a hundred lines long and take a couple of minutes to compile
我很早就没有东西了,但我的汇编仍然走过几分钟。
这里是我方言中最复杂的部分。 它是被分成小部分的候选人吗?
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 >> tok.between_ >> tok.value >> "," >> tok.value ) [ bind( &cRuleKit::AddConditionBetween, &myRulekit, _pass, _1, _3, _4 ) ]
;
sequel
= ( tok.priority_ >> tok.high_ ) [ bind( &cRuleKit::setPriority, &myRulekit, 3 ) ]
| ( tok.priority_ ) [ bind( &cRuleKit::setPriority, &myRulekit, 2 ) ]
| ( tok.interval_ >> tok.value ) [ bind( &cRuleKit::setInterval, &myRulekit, _2 ) ]
| ( tok.mp3_ >> tok.identifier ) [ bind( &cRuleKit::setMP3, &myRulekit, _2 ) ]
| ( tok.disable_ ) [ bind( &cRuleKit::setNextRuleEnable, &myRulekit, false ) ]
;
通过对图表部分的评论,我发现,大部分汇编者花时间。
set_reading
= tok.set_reading >> +attribute_reading
;
attribute_reading
= ( tok.name_ >> tok.identifier )
[ bind( &cPackage::Add, &myReadings, _pass, _2 ) ]
| ( tok.nmea_ >> tok.identifier )
[ bind( &cPackage::setNextNMEA, &myReadings, _2 ) ]
| ( tok.column_ >> tok.integer )
[ bind( &cPackage::setNextColumn, &myReadings, _2 ) ]
| ( tok.precision_ >> tok.value )
[ bind( &cPackage::setNextPrecision, &myReadings, _2 ) ]
| ( tok.unit_ >> tok.identifier )
[ bind( &cPackage::setNextUnit, &myReadings, _2 ) ]
| ( tok.value_ >> tok.identifier )
[ bind( &cPackage::setNextValue, &myReadings, _2 ) ]
| ( tok.qualifier_ >> tok.identifier >> tok.qual_col_ >> tok.integer )
[ bind( &cPackage::setNextQualifier, &myReadings, _2, _4 ) ]
;
I wouldn t call it complex, but it is certainly the longest rule. So I thought I would try splitting it up, like this:
set_reading
= tok.set_reading >> +attribute_reading
;
attribute_reading
= attribute_reading_name
| attribute_reading_nmea
| attribute_reading_col
| attribute_reading_precision
| attribute_reading_unit
| attribute_reading_value
| attribute_reading_qualifier
;
attribute_reading_name
= ( tok.name_ >> tok.identifier ) [ bind( &cPackage::Add, &myReadings, _pass, _2 ) ]
;
attribute_reading_nmea
= ( tok.nmea_ >> tok.identifier ) [ bind( &cPackage::setNextNMEA, &myReadings, _2 ) ]
;
attribute_reading_col
= ( tok.column_ >> tok.integer ) [ bind( &cPackage::setNextColumn, &myReadings, _2 ) ]
;
attribute_reading_precision
= ( tok.precision_ >> tok.value ) [ bind( &cPackage::setNextPrecision, &myReadings, _2 ) ]
;
attribute_reading_unit
= ( tok.unit_ >> tok.identifier ) [ bind( &cPackage::setNextUnit, &myReadings, _2 ) ]
;
attribute_reading_value
= ( tok.value_ >> tok.identifier ) [ bind( &cPackage::setNextValue, &myReadings, _2 ) ]
;
attribute_reading_qualifier
= ( tok.qualifier_ >> tok.identifier >> tok.qual_col_ >> tok.integer ) [ bind( &cPackage::setNextQualifier, &myReadings, _2, _4 ) ]
;
这节省了总编辑时间的几分钟!
奇怪的是,顶峰的记忆要求仍然不变,仅仅需要时间较少。
因此,我感到更希望的是,在学习方面,我的所有努力都得到了加强:眼光是值得的。
我确实认为,汇编者需要如此仔细地以这种方式指导,这是很奇怪的。 我想,一位现代的汇编者会注意到,这一规则只是一份独立的其他资源规则清单。
我花了七天最好的学习力:心灵,把一个小但真实的世界从法轮到来。 我的结论是,它行之有效,法典非常可取。 不幸的是,简单地扩大教学法对实际应用的粗略使用,迅速使汇编者负担过重——记忆和汇编所需时间完全不切实际。 显然,存在管理这一问题的技术,但需要的是我没有时间学习的北极知识。 我猜测,我将坚持灵活的做法,这种灵活性可能是ug和老的,但相对简单,而且迅速缓解。