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


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


另一个最好用这个虚拟示例说明:我想解析一个逗号分隔 vector< int>
中的整数列表,但它只应在列表总和为零时进行解析:
auto const int_list = rule< class int_list,vector< int>>(“int_list”)
 = int_%','
 >> eps(/ *如何提取属性?* /);



 我坚持最后一次检查,因为我不喜欢知道如何掌握规则正在合成的 vector< int>
。
答案 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);}
}
}