我有一个关于">"运算符对提升精神的语义操作的问题
我得到了这个规则,它非常有效..
ifelse = (iter_pos >>
nocaselit(L"if") >> expression >> nocaselit(L"then") >>
block_statements_eol >> -ifelse_ifelse >> nocaselit(L"end") >> nocaselit(L"if") >>
iter_pos)
[_val = construct<common_node>(type_cmd_ifelse,LOCATION(_1,_5), key_cond, _2, key_seq, _3, key_else, phoenix::bind(&makeOptNode, _4))];
为了添加一些错误处理,我还向解析器中添加了on_error的东西。据我了解,我还必须为boost添加"期望点"以输出正确的错误
因此,我将语法更改为此语法(将>>替换为>(,以提供有关停止回溯和报告错误的信息。
ifelse = (iter_pos >>
nocaselit(L"if") > expression > nocaselit(L"then") >>
block_statements_eol > -ifelse_ifelse > nocaselit(L"end") > nocaselit(L"if") >>
iter_pos)
[_val = construct<common_node>(type_cmd_ifelse,LOCATION(_1,_5), key_cond, _2, key_seq, _3, key_else, phoenix::bind(&makeOptNode, _4))];
在这一点上,我得到了 _3 和 _4 的 C++ 编译器错误无效索引.. 所以似乎必须以某种方式更改语义操作,但我不知道如何更改。
运算符优先级更改合成的属性结构。
例如,int_ >> int_ >> int_
和int_ > int_ > int_
都合成了一个tuple<int, int, int>
但是如果你混合了不同优先级的运算符,你会得到例如tuple<int, tuple<int, int> >
或tuple<tuple<int, int>, int>
/
现在,对于许多自动属性传播方案,这不会有什么坏处。但是对于语义操作,它会更改语法以剖析属性(请参阅fusion::at_c<>
和phoenix::at_c<>
(。
有可能记录不足
#define BOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT
在特定情况下可能会有所帮助,但除此之外,只需处理它。
一般来说,避免语义行为是一个很好的指导方针(Boost Spirit:"语义行为是邪恶的"?(。