- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
到目前为止,我有一个语法一直在使用标准的 boost::spirit::ascii::space
/boost::spirit::ascii::space_type
船长。
我有一些使用船长的规则和一些不使用的规则,比如
qi::rule<Iterator, PTR<Expression>(), ascii::space_type> expression;
qi::rule<Iterator, PTR<Term>()> term;
当我在跳跃式非终结符(如 expression
)内部使用非跳跃式非终结符(如 term
)时,一切都像我期望的那样工作 - 空格只在内部起作用term
非终结符。
此外,到目前为止,我一直很好地包括在不使用 qi::skip
重新建立跳过的非终端内部使用 skipper 的非终端,例如
index = (qi::lit('[') >> qi::skip(ascii::space)[explist >> qi::lit(']')]);
这样,空格在 []
大括号内并不重要,但在外面。
但是,现在我想添加我自己的自定义船长(我想让换行符有意义,然后添加评论跳过)。我的船长语法如下:
struct skip_grammar : qi::grammar<Iterator> {
qi::rule<Iterator> start;
skip_grammar() : skip_grammar::base_type(start) {
start = qi::char_("\t\r ");
}
};
我已经能够像这样将它添加到我的规则定义中了
qi::rule<Iterator, PTR<Expression>(), skip_grammar> expression;
但我似乎无法弄清楚如何使用我的跳过语法作为 qi::skip
的参数(并替换 ascii::space
)。我试过使用类型、局部实例变量和全局实例变量。我得到的最远的是让 clang 提示我的 skip_grammar 需要一个复制构造函数。所以我尝试向我的跳过语法添加一个复制构造函数,但显然 boost::noncopyable
基类存在是有原因的,因为我的二进制段几乎立即发生错误。
我应该如何使用它?
谢谢
最佳答案
qi::grammar
只是qi::rules
的容器。它没有复制构造函数,因为这可能会无意中在这些规则右侧的解析器表达式中创建悬空引用。
按照您的意愿使用语法作为跳过器有点棘手,相当于将语法的开始规则传递给跳过解析器。仅为此创建一个规则实例可能更容易(特别是如果您只有一个规则船长)。
在任何情况下,规则都需要作为引用传递给船长(通过调用规则的成员函数alias()
):
skip_grammar skippper;
index = '[' >> qi::skip(skipper.start.alias())[explist >> ']'];
或者简单地说:
rule<iterator> skipper = qi::char_("\t\r ");
index = '[' >> qi::skip(skipper.alias())[explist >> ']'];
别名是必要的,因为它意味着复制规则的具体含义。在 Spirit 的常见问题解答中有更详细的描述 here .
关于c++ - Boost Spirit Qi Re-Establish skipping with custom skip 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5037661/
假设我们要解析一个内积表达式并得到结果。 "SUM({1, 2, 3} .* {4, 5, 6})" qi::_1 和 qi::_2 非常方便地在解析器中引用第 i 个属性。 void Test(st
无法弄清楚为什么这条规则 unary_msg 不起作用,它说属性类型是 qi::unused_type 但这对我来说毫无意义。为什么 boost 会这样折磨我? template struct g3:
从测试中我可以得到 qi::uint_parser()与 qi::uint_ 相同.他们从 0 解析整数至 UINT_MAX . 我不明白的是qi::uint_parser需要 std::numeri
bool EqnExprEvaluator::SetEqn(const std::string& eqnStr) { typedef std::string::const_iterator
我一直在使用 Boost 库中的 Spirit Qi 用 C++ 编写语法。作为该语言的新手,很难习惯该库的语法和怪癖,但现在我有点了解它的工作原理。 我在使用 qi::lexeme 时遇到错误。我的
我需要跟踪一些项目在我使用提升灵气解析的文本中的位置。我找到了 this example并适应这样: #include #include #include #include #include
我想做的是在运行时从 ABNF 语法文件创建一个解析器。我已经在 qi::grammar 中实现了所有 ABNF 规则,如下所示: typedef /*qi::rule or struct conta
我在boost_1.59中使用spirit来解析类c语言(名为stone,最初由java编写)。但是我在使用 boost::spirit::qi 解析 c 风格的字符串时遇到了麻烦。整个代码位于 co
我正在用 Boost.Spirit 做一个 IRC 消息解析器,但是当我尝试解析一个输入时我遇到了一个(很长的)错误。我遵循了“Roman Numerals”示例。此外,我将 g++4.7 与 -st
如何解析可能包含 double 或 int 的字符串,具体取决于是否设置了点。例如。 6.0是double类型,6是int类型。规则是 rule,skipper> r = qi::double_|qi
在 boost::spirit::traits::transform_attribute 中指示解析失败的正确方法是什么?我可以抛出任何旧的异常,还是它要我做的特定事情? namespace boos
我正在尝试使用 qi 创建通用解析器元素,因为不幸的是(必须支持 MSVC)无法使用 X3。这个想法是有一个模板化的结构: template struct parse_type; 我可以这样使用: t
我正在尝试创建一个返回 function 的规则通过柯里化(Currying) Phoenix 表达式构造。例如, start = int_[_val = xxx]; rule start; 应该做什
我正在解析一个文本文件,可能有几 GB 的大小,由以下几行组成: 11 0.1 14 0.78 532 -3.5 基本上,每行一个整数和一个 float 。整数应该是有序的并且是非负的。我想验证数据是
我想提出一个让我陷入困境的主题,并提出了一个关于齐::符号。 这一切都始于我查看新的野兽图书馆并阅读 atutorial example 它以一个从 http 路径猜测 mime 类型的函数开始扩展。
我有一段 boost::spirit::qi 代码可以匹配 "M7.x.y.z" 或 "M7.x.y.z ",但我想要一个在前一个输入上失败的解析器。 我想我需要在其中插入 qi::lexeme[]
我正在尝试为一种语言的多个子集定义一些 Boost::spirit::qi 解析器,代码重复最少。为此,我创建了一些基本的规则构建函数。原来的解析器工作正常,但一旦我开始使用组合函数,我的解析器似乎就
假设我有一个简单的类型foo: struct foo { void bar(int) { // do something } }; 我想使用 Boost.Qi 来解析字符串中的整数字段,并使用结果值调
(免责声明,我正在学习提升精神) 我正在尝试解析这样的表达式:F( 1 ) 并希望将 1 作为字符串(“1”而不是数字(与 qi::int_ 一起使用))。 我试过这样的事情(这是错误的,但也许我的方
假设我有两个用逗号分隔的 double 来解析返回它们的总和。在 Haskell 中我可能会这样做: import Data.Attoparsec.Text import Data.Text (pac
我是一名优秀的程序员,十分优秀!