使用">"运算符增强语义操作



我有一个关于">"运算符对提升精神的语义操作的问题

我得到了这个规则,它非常有效..

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:"语义行为是邪恶的"?(。

最新更新