我读过关于递归解析的其他主题,但这些解决方案对我来说还不够。
让我们拥有这样一个简单的解析器:
struct B;
typedef boost::variant<int, boost::recursive_wrapper<B> > A;
struct B {
B() {
static int l = 0;
cout << "B() " << ++l << endl;
}
A a1;
A a2;
};
// fusion adapt structs ....
typedef std::string::iterator iter;
typedef rule<iter, B()> BRule;
typedef rule<iter, A()> ARule;
ARule a;
BRule b;
a %= b | int_;
b %= a >> lit(',') >> a;
std::string s("5,8,3,1");
iter be = s.begin();
iter en = s.end();
B u;
parse(be, en, b, u);我想解析类似于's‘字符串的东西:"5,1,3,9“--这应该由B元素组成,B元素包含仅包含整数的2B元素。
根据站点名称,它会导致堆栈溢出。当我加上括号时:
b %= '(' >> a >> lit(',') >> a >> ')';
std::string s("((5,8),(3,1))");..。一切都很好。
是否有可能以这种方式避免使用括号和使用解析器:
a %= b ....
b %= a ... ??不一定是这样的表示法,而是用于解析“3,4,5,6”而不是“((3,4),(5,6)”
发布于 2015-04-02 15:05:15
不,你不能这样做,解析器只会在这两条规则之间来回反弹。
为什么解析器不简单:
b %= int_ >> *(lit(',') >> int_);或者,您通常会看到表单的构造:
expression %= primary >> *(lit(',') >> primary);
primary %= '(' >> expression >> ')' | int_;您还可以使用列表解析器并将其编写为:
expression %= primary % lit(',');
primary %= '(' >> expression >> ')' | int_;https://stackoverflow.com/questions/29415865
复制相似问题