问题标签 [boost-spirit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++/Boost:编写更强大的 sscanf 替代品
我想用 C++ 编写一个函数来替换 C 的 sscanf,它将匹配项分配给迭代器。
基本上,我想要类似的东西:
确切的细节可能会有所不同,但你明白了。有什么实施想法吗?
到目前为止的选项以及迄今为止的问题:
- std::istringstream:没有用于匹配常量表达式的操纵器
- Boost.Regex:不确定这是否可行,而且它似乎比必要的复杂得多
- Boost.Spirit:不要认为这适用于动态生成的格式字符串,而且它似乎也比必要的更复杂
- sscanf:它可以工作,但是是非标准的,等等,并且使用它需要很多开销,因为参数的数量是在编译时确定的
c++ - 使用自定义跳过语法增强精神气重新建立跳过
到目前为止,我的语法一直在使用标准boost::spirit::ascii::space
/boost::spirit::ascii::space_type
船长。
我有一些使用船长的规则和一些不使用的规则,比如
term
当我在跳过的非终结符(如)内使用非跳过的非终结符(如expression
)时,一切都像我预期的那样工作 - 空格只在term
非终结符内部很重要。
此外,到目前为止,我一直很好,包括在不用于qi::skip
重新建立跳过的非终端内使用船长的非终端,例如
这样,空格在[]
大括号内部并不重要,但在外部。
但是,现在我想添加我自己的自定义跳过程序(我想让换行符变得重要,然后添加评论跳过)。我的船长语法看起来像:
我已经能够将它添加到我的规则定义中,就像
但我似乎无法弄清楚如何使用我的跳过语法作为qi::skip
(和替换ascii::space
)的参数。我尝试过使用类型、局部实例变量和全局实例变量。我得到的最远的是让clang抱怨我的skip_grammar需要一个复制构造函数。所以我尝试在我的跳过语法中添加一个复制构造函数,但显然boost::noncopyable
基类的存在是有原因的,因为我的二进制文件几乎立即发生了段错误。
我应该如何使用这个?
谢谢
c++ - 如何从 Spirit::Qi 规则访问 boost::variant 成员?
我找不到在我的 Spirit-Qi 语法中使用 boost::phoenix 访问 boost::variant 成员的正确方法。这是我想要实现的简单示例。(我的整个语法要复杂得多,这是我正在测试提到的问题的简单片段)。
但是我找不到任何 phoenix::get<> 或任何类似的方法来使用 Phoenix 访问 boost::variant。我需要 phoenix::get<> 的原因是因为我需要将变量插入到具有特定类型的列表中,然后将此特定类型作为对子规则的引用作为继承属性传递:
有什么办法可以实现这样的行为?
感谢您的回复
瑞克
c++ - 将文件路径字符串传递给 Boost.Spirit 中的语义操作
我是 Boost.Spirit 的新手,我有一个与我尝试使用该库实现的迷你解释器相关的问题。作为解析我的语言的子任务,我需要从表单的输入中提取文件路径:
并将其作为字符串(不带引号)传递给语义动作。
我写了一些代码来解析这种类型的输入,但是传递解析的字符串并没有按预期工作,可能是因为我缺乏 Boost.Spirit 的经验。
任何人都可以帮忙吗?
实际上,我的语法更复杂,但我已将问题隔离为:
输出是:
但我想获得:
c++ - 提振精神和提振凤凰问题
一。是否可以使用传递给规则的参数定义精神规则的局部变量默认构造?我有具有循环依赖关系的 AST 构建器对象,我想使用对父级的引用来初始化子级,父级通过对子解析器规则的引用传递。例子:rule< Iterator, void(Parent & p), locals<child> > child_parser;
注意:上面有我想做的事情的方法。我只对我上面所说的特定方法感兴趣,因为它是最干净的方法。
二。如何将指针传递给懒惰的凤凰占位符?它不能像&_r1
或那样简单&arg1
注意:这个问题已经在这里单独提出,你可以在那里回答。
三。lambda / phoenix 合并进展如何,知道合并何时发生吗?
ps,提前感谢您回答我的问题 Hartmut :D
c++ - 在 boost::spirit 中使用指向解析器的指针
基本上我正在做一个表达式解析器。由于我需要尽可能好的性能,并且根据文档构造语法可能会相当慢,我想在解析之前重用语法并绑定符号表。由于语法的客户端可能有一个在解析之前构建和维护的符号表,因此我最好也避免复制实际表,这导致我使用以下代码(简化)来翻译术语:
这里的问题是 m_Symbols。我想要 m_Val 通过引用来保存 m_Symbols,因为当我们绑定符号表时,我自然会修改指针,我认为这可以通过使用 boost::phoenix::ref 以某种方式解决?但更大的问题是我在合成新的解析器时似乎无法使用指向解析器的指针。在表达式中使用取消引用会立即取消引用 m_Symbols,这是不需要的,我想延迟取消引用以解析时间。
boost-spirit - 如何为 boost::spirit::qi 和 std::list 容器定义流操作符
在我的一条规则中,将 qi::locals<> 与 stl 容器作为参数。当我在没有 BOOST_SPIRIT_QI_DEBUG 的情况下编译我的程序时,一切正常。但是当我打开 BOOST_SPIRIT_QI_DEBUG 时,由于缺少运算符 <<,程序无法编译。
简化片段:
错误:
我试图为 TlstValues 定义流式操作符,但没有效果。错误还是一样。我的运营商定义:
有人可以告诉我如何定义所需的运算符以使 BOOST_SPIRIT_DEBUG 工作吗?
谢谢和问候瑞克
c++ - 使用 C++ boost::spirit PEG 语法生成表达式
我对 C++ 和 boost::spirit 很陌生。尝试通过构建一个只有 || 的简单表达式树来学习两者 和 && 使用 PEG。我已经从文档中的 mini-xml 教程构建了许多代码部分。
这是代码,它适用于简单的字符串,如“1 || 0”、“1 && 0”、“1 || 1 && 0”……但对于“(1 || 1)”则失败。我不太明白为什么它无法打印,即使它说解析成功。
另外,请进一步指导我如何使这段代码从长远来看更直观和可维护。
c++ - 齐::规则不解析输入字符串
我有一个奇怪的麻烦:
输入为“WELL name3 PROD OIL \n”。control 和 limit 是符号表。
我做错了什么?
更新:
定义 BOOST_SPIRIT_QI_DEBUG 并在表达式之前使用 BOOST_SPIRIT_DEBUG_NODE (param) 如果使用 str ,我会得到以下输出:
在 +alnum 的情况下,我得到:
回溯:
c++ - 升压精神太贪心
我在对 boost::spirit 的深深钦佩和不理解它的永恒沮丧之间徘徊;)
我对过于贪婪的字符串有问题,因此它不匹配。下面是一个由于 txt 规则耗尽而无法解析的最小示例。
关于我想做的更多信息:目标是解析一些伪 SQL,我跳过空格。在类似的声明中
我需要将from
其视为特殊关键字。规则类似于
但它显然不起作用,因为它被 bar.id from foo
视为一个项目。