阅读和观看此演示文稿:http:
//boost-spirit.com/home/2011/06/12/ast-construction-with-the-universal-tree/
我发现了这个陈述 - 基本上我们建议不要使用语义动作.
我必须承认,我已经感受到了类似的东西:具有语义行为的语法实际上看起来有点难看.而且,当我需要扩展/改变它们时,它完全采用语义动作进行了大量的"微观管理".在演示文稿中演示的具有属性语法的方法似乎更加优雅和有前途.
所以我想问:这是一个"官方"观点吗?我应该学习如何使用属性语法并更详细地避免语义动作吗?如果是这样 - 我想=要求一些基本的(甚至是微不足道的)例子,展示这样的方法 - LISP解释器太复杂了我不能咀嚼......
我正在尝试用boost.spirit的qi库解析一些东西,而且我遇到了一个问题.根据精神文档,a >> b应该产生类型的东西tuple<A, B>.但这是一个boost::tuple(又名融合矢量),而不是std::tuple(我想要的).
有没有简单的方法在boost::tuple=> 之间进行这种转换std::tuple?
相同的文档页面说明*a应该生成类型的东西vector<A>.这似乎产生了一种std::vector<A>(或某种boost::vector<A>可以隐含地转换为a std::vector<A>).我只是想知道元组是否有相同的行为.
我正在尝试为参数列表编写一个解析器,这将允许以下内容:
myFunc( arg0, arg1, namedArg0 = valueA, namedArg1 = valueB )
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我希望前两个参数解析为TypeA的实体,然后由std :: vector <TypeA>包含.后两个参数将解析为TypeB,它将由std :: vector <TypeB>包含.所有TypeA参数都应该在所有TypeB参数之前.但是我想从一个以逗号分隔的列表中解析所有内容.应该可以只有TypeA参数,只有TypeB参数或TypeA元素序列,后跟一系列TypeB元素.
我无法定义规则,以便将最终的TypeA参数与第一个TypeB参数分开的逗号不会被误认为是另一个TypeA参数的期望.
我目前的实施情况如下.任何人都可以就如何解决这个问题提出任何建议吗?
这里的关键区别是TypeA参数应该是单个符号,而TypeB参数应采用以下形式:symbol = symbol.
问题似乎与TypeA参数等同于TypeB参数的第一部分这一事实有关,因此使得TypeA序列的结尾不清楚?
谢谢!
struct Params
{
std::vector<TypeA> a_elements;
std::vector<TypeB> b_elements;
Params(const std::vector<TypeA>& a_vec, const std::vector<TypeB>& b_vec)
: a_elements( a_vec ), b_elements( b_vec ) {}
static Params create(const std::vector<TypeA>& a_vec, const std::vector<TypeB>& b_vec)
{
return Params( a_vec, b_vec );
}
};
struct ParamsParser : qi::grammar<Iterator, Params(), Skipper>
{
qi::rule<Iterator, Params(), Skipper> start_rule;
qi::rule<Iterator, std::vector<TypeA>(), Skipper> type_a_vec_opt_rule;
qi::rule<Iterator, std::vector<TypeB>(), Skipper> …Run Code Online (Sandbox Code Playgroud)