我如何在精神X3中添加条件期望点
How can I add conditional expectation points in spirit X3
我目前正在向X3中的语法添加期望点。现在我遇到了一个规则,它看起来像这样。
auto const id_string = +x3::char("A-Za-z0-9_);
auto const nested_identifier_def =
x3::lexeme[
*(id_string >> "::")
>> *(id_string >> ".")
>> id_string
];
我想知道如何在此规则中添加条件期望点。比如"如果有一个"::"那么一定有一个id_string
"或者"如果有一个.
那么一定有一个id_string
"等等......对于这样的规则,我怎样才能达到这样的行为呢?
我会按照你想要的方式来写:
auto const identifier
= lexeme [+char_("A-Za-z0-9_")];
auto const qualified_id
= identifier >> *("::" > identifier);
auto const simple_expression // only member expressions supported now
= qualified_id >> *('.' > identifier);
和相应的AST:
namespace AST {
using identifier = std::string;
struct qualified_id : std::vector<identifier> { using std::vector<identifier>::vector; };
struct simple_expression {
qualified_id lhs;
std::vector<identifier> rhs;
};
}
现场演示
Live On Coliru
#include <iostream>
#include <string>
#include <vector>
namespace AST {
using identifier = std::string;
struct qualified_id : std::vector<identifier> { using std::vector<identifier>::vector; };
struct simple_expression {
qualified_id lhs;
std::vector<identifier> rhs;
};
}
#include <boost/fusion/adapted.hpp>
BOOST_FUSION_ADAPT_STRUCT(AST::simple_expression, lhs, rhs)
#include <boost/spirit/home/x3.hpp>
namespace Parser {
using namespace boost::spirit::x3;
auto const identifier
= rule<struct identifier_, AST::identifier> {}
= lexeme [+char_("A-Za-z0-9_")];
auto const qualified_id
= rule<struct qualified_id_, AST::qualified_id> {}
= identifier >> *("::" > identifier);
auto const simple_expression // only member expressions supported now
= rule<struct simple_expression_, AST::simple_expression> {}
= qualified_id >> *('.' > identifier);
}
int main() {
using It = std::string::const_iterator;
for (std::string const input : { "foo", "foo::bar", "foo.member", "foo::bar.member.subobject" }) {
It f = input.begin(), l = input.end();
AST::simple_expression data;
bool ok = phrase_parse(f, l, Parser::simple_expression, boost::spirit::x3::space, data);
if (ok) {
std::cout << "Parse success: ";
for (auto& el : data.lhs) std::cout << "::" << el;
for (auto& el : data.rhs) std::cout << "." << el;
std::cout << "n";
}
else {
std::cout << "Parse failure ('" << input << "')n";
}
if (f != l)
std::cout << "Remaining unparsed input: '" << std::string(f, l) << "'n";
}
}
打印
Parse success: ::foo
Parse success: ::foo::bar
Parse success: ::foo.member
Parse success: ::foo::bar.member.subobject
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 如何在C++中从两个单独的for循环中添加两个数组
- 在没有太多条件句的情况下,我如何避免被零除
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- 如何有条件地将元素添加到 std::array - C++11
- 有条件地使用 Boost Python 添加模块
- 有条件地添加到过载集是否合法
- 我将如何在此处添加条件变量
- 使用 QML 添加具有条件的类
- 有条件地将文件添加到项目中C++库中
- C++,在类变量中添加条件语句
- 如何有条件地添加增强 MPL
- C++,在类变量中添加条件
- 是否可以添加一些条件' boost::signal '
- 如何有条件地将函数添加到类模板中
- 我如何在精神X3中添加条件期望点
- c++预处理器添加word if条件
- c++尝试添加Peterson算法以避免共享内存中的竞争条件