我試圖解析爲具有這種類型的語法的循環:如何使用boost :: sprit來解析嵌套for循環?
for(loop = 1:10) {
}
在我的語法我有規則:
genericString %= lexeme[+(char_("a-zA-Z"))];
intRule %= int_;
commandString %= lexeme[+(char_ - '}')];
forLoop %= string("for")
>> '('
>> genericString // variable e.g. c
>> '='
>> (intRule | genericString) // variable e.g. i
>> ':'
>> (intRule | genericString) // variable e.g. j
>> ')' >> '{'
>> (forLoop | commandString)
>> '}';
儘管這適用於上面的簡單的例子,它無法解析下面的嵌套示例:
for(loop = 1:10) {
for(inner = 1:10) {
}
}
我猜這是由於解析器'與大括號放置混淆'。我想我需要做一些類似於http://boost-spirit.com/distrib/spirit_1_7_0/libs/spirit/example/fundamental/lazy_parser.cpp(唉,我發現很難遵循)。
乾杯,
本。
編輯1:
現在我想這將是更好地處理來自CommandString中(下文稱爲nestedBlock)遞歸而非for循環中,即是這樣的:
forLoop %= string("for")
>> '('
>> genericString // variable e.g. c
>> '='
>> (intRule | genericString) // variable e.g. i
>> ':'
>> (intRule | genericString) // variable e.g. j
>> ')'
>> nestedBlock;
nestedBlock %= lexeme['{' >> -(char_ - '}' - '{')
>> -nestedBlock
>> -(char_ - '}' - '{')
>> '}'];
這與大規模boost :: spriti錯誤失敗。該規則被定義爲:
qi::rule<Iterator, std::string(), ascii::space_type> nestedBlock;
qi::rule<Iterator, Function(), ascii::space_type> forLoop;
功能是增強的結構變異::
編輯2:
因此,這是我現在有(其中設計有或沒有嵌套工作結構):
commandCollection %= *start;
forLoop %= string("for")
>> '('
>> genericString // variable e.g. c
>> '='
>> (intRule | genericString) // variable e.g. i
>> ':'
>> (intRule | genericString) // variable e.g. j
>> ')'
>> '{'
>> commandCollection
>> '}';
start %= loadParams | restoreGenomeData | openGenomeData | initNeat | initEvo |
initAllPositions | initAllAgents | initCoreSimulationPointers |
resetSimulationKernel | writeStats | restoreSimState |
run | simulate | removeObjects | setGeneration |
setParam | getParam | pause | create | reset |
loadAgents | getAgent | setAgent | listParams | loadScript | forLoop
| wait | commentFunc | var | add | sub | mult | div | query;
我宣佈commandCollection規則如下:
qi::rule<Iterator, boost::fusion::vector<Function>, ascii::space_type> commandCollection;
我認爲這會做我想的。 commandCollection被定義爲0或更多的命令,它們應該存儲在boost :: fusion :: vector中。但是,當我從Function()結構中提取向量時(考慮到啓動規則使用Function()迭代器),由於某種原因,該類型未被識別爲boost :: fusion :: vector,因此不能提取。我不知道爲什麼...
但是,如果我只是有
commandCollection %= start;
和decalre治國
qi::rule<Iterator, Function(), ascii::space_type> commandCollection;
,然後嘗試提取數據爲單函數()結構,它工作正常。但我希望它在某種容器中存儲多個命令(即* start)。我也嘗試過一個std :: vector,但是這也失敗了。
,什麼是問題? – 2013-03-06 12:51:49
對我來說問題很清楚。 – sehe 2013-03-06 13:44:17
@sehe - 我只是在Arne的評論之後澄清了標題中的問題:-) – 2013-03-06 13:55:47