提升Spirit X3局部变量并获取合成属性

时间:2016-02-04 17:54:48

标签: c++ boost boost-spirit boost-spirit-x3

我正在尝试将解析器从Spirit V2移植到X3。整体体验非常好但有两个问题。





第一个是局部变量消失了,这对我来说非常不方便,因为我经常使用它们来跟踪事物。因此,我要求做一些可以在V2中完成本地工作的东西。





另一个最好用这个虚拟示例说明:我想解析一个逗号分隔 vector< int> 中的整数列表,但它只应在列表总和为零时进行解析:




  auto const int_list = rule< class int_list,vector< int>>(“int_list”)
 = int_%','
 >> eps(/ *如何提取属性?* /);
  




我坚持最后一次检查,因为我不喜欢知道如何掌握规则正在合成的 vector< int>




1 个答案:

答案 0 :(得分:2)

我有同样的发现!

“本地人”的诀窍是使用_pass指令。

因为您没有提供使用方案,我认为不值得提供示例,但您可以搜索我的答案*

第二个技巧是使用语义动作(可以是lambda)并分配auto zerosum = [](auto &ctx) { auto& v = x3::_attr(ctx); _pass(ctx) = std::accumulate(v.begin(), v.end(), 0) == 0; }; Boost Spirit X3 cannot compile repeat directive with variable factor也显示了这一点:

import java.io.*;
class Thh implements Runnable
{
    public void run()
    {
        for(int i=0;i<5;i++)
        {
            System.out.println(Thread.currentThread().getName());
            try{
                Thread.sleep(1000);
            }catch(Exception e){System.out.println(e);}
        }
    }
}

class Runth
{
    public static void main(String s[])
    {
        Thh t1=new Thh();
        Thread tt1=new Thread(t1,"thread1");tt1.start();
        Thh t2=new Thh();
        Thread tt2=new Thread(t2,"thread2");tt2.start();
        for(int i=0;i<5;i++)
        {
            System.out.println(Thread.currentThread().getName());
            try{
                Thread.sleep(1000);
            }catch(Exception e){System.out.println(e);}
        }
    }