问题标签 [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++ - 如何使用存储在 boost Spirit 闭包中的变量作为 boost Spirit 循环解析器的输入?
我想使用解析后的值作为循环解析器的输入。
该语法定义了一个标头,该标头指定以下字符串的(可变)大小。例如,假设以下字符串是某个解析器的输入。
12\r\n测试负载
解析器应该提取12,将其转换为无符号整数,然后读取十二个字符。我可以定义一个可以编译的 boost Spirit 语法,但是 boost Spirit 代码中的断言在运行时会失败。
是否可以告诉精神闭包变量应该被懒惰地评估?这种行为是否得到了提升精神的支持?
c++ - 如何为 unsigned char 类型编译 boost::spirit?
boost::spirit 在 boost::spirit::char_class::ascii::isalnum() 处断言
当传递 ascci 字符 > 127 时。
我将所有私有变量从 std::string 更改为
但仍然 boost 在内部使用 std:.string 。我需要做什么 ?
c++ - boost::spirit 并生成不同的节点
问候。
我对如何强制 boost::spirit 在解析语法和生成 AST 时生成不同类的节点很感兴趣。比如说,我想要不同的节点,例如 VariableNode(其成员为变量的名称)、ValueNode(其成员为 value)等。
在处理 tree-walker 时会非常有用。在这种情况下,我们将编写一个基本抽象类来遍历所有不同的节点(应用“访问者”模式),并在处理语义检查阶段、代码生成阶段等时对其进行扩展。
boost::spirit 允许我们参数化用于树的工厂,但我一直无法找到合适的方法来调整其行为。
任何想法,代码?提前致谢。
c++ - boost spirit 2.x:如何处理关键字和标识符?
再会。
我过去一直在使用 boost spirit 经典版,现在我正在尝试使用更新的 boost spirit 2.x。有人能指点我如何处理关键字吗?比如说,我想区分“foo”和“int”,其中“foo”是标识符,“int”只是一个关键字。我想保护我的语法免受不正确的解析,比如“intfoo”。
好的,我有
和 ident 规则声明为:
并且,比如说,一些规则:
如何正确写,说明“void”、“float”等是关键字?提前致谢。
c++ - 提振精神和转发申报问题
有人可以给我一些关于如何处理需要查看进一步声明以便能够在当前时刻做出正确语义动作的情况的建议/想法吗?例如,当有人编写某种不支持“前向声明”的编程语言的解释器/编译器时,这是一个众所周知的事件。让我们举个例子:
很明显,我们必须至少有两次通过。首先,我们解析所有函数声明并获取所有需要的信息,例如:函数接受的参数数量,它们的类型,然后我们能够处理函数调用并解决上述困难。如果我们这样做,我们将必须使用一些AST遍历机制/访问者来完成所有这些传递。在这种情况下,我们必须处理 AST 遍历/应用访问者,我们必须对直接集成在解析器中的所有美丽的凤凰结构说“再见”。
你会如何处理这个问题?
boost-spirit - How to change the internal char type of the parser?
I've been using spirit classic for quite a while and recently start learning v2. Both are easy to use and powerful enough to handle moderate parsing issue.
In those idyllic days with the spirit classic and ascii characters, the job is simply adapting an EBNF to LL form. But finally, I have to deal with the i18n.
My thought is really crude. Make a forward iterator which iterates over the input text byte stream of any encoding. The iterator handles these encoding conversion job and feeds the parser with utf16/32 code unit(the iterator could be easily implemented by either iconv or icu4c).
The type of code unit should be the internal char type processed by parser. But after reading through the doc, I could find only several primitive, iterator templates have a explicit char_t parameter. Does that mean I have to reformulate those numerics, directives, scanners,and etc.?
I also checked out the v2 doc. It offers a namespace way to make everything consistent, but still not too much about how to explicitly change the internal char type. Again, I searched the mailing list archive, but seems those unicode and other encoding related post is still up in the air. Some one told me that spirit could still work through those files with different encoding. So I tested the parser using files with different encoding but same content. Several MBCS encoded files passed the test, and casually some utf8 file also passed. But other encoding failed most of the time.
c++ - 用 boost.spirit 2 存储表达式的行号
我计划使用 Boost.Spirit 2 做一个脚本转换实用程序(用于扩展诊断信息)。
虽然支持解析错误的行信息等,但我如何存储行号以使用 Qi 成功解析表达式?
c++ - boost::spirit 从语法中组合语法
我已经弄清楚了如何使用精神——也就是说,我写了一个中等复杂的语法。我总是采用扩展程序的方法——一次一个子系统。我已经为一个复杂模型编写了数据结构,它在最高级别有 4 种类型。
我想使用由规则方法组成的语法一次解析一种类型的顶级类型——即,我想用一种顶级语法编写 4 个语法。如果这是可能的(我开始怀疑),有人可以发布一个片段或对执行此操作的项目的引用。
具有 50 多个(可能更多)规则(用于正确错误处理)的顶级语法听起来并不有趣(TMP 代码易变/编译缓慢,并提供无用的错误消息)。
c++ - 未排序模式的 boost::Spirit 语法
对于需要解析的模型,我有一部分模式。可以说它如下所示。
属性是:
- 元素可能看起来是无序的。
- 作为模式一部分的所有元素都必须出现,不能出现其他元素。
- 所有元素的综合属性都进入一个结构。
- (可选)模式将来可能取决于类型字段——即基于类型的不同字段——但是我目前并不关心这个。
c++ - Boost.Spirit.Qi 使用中的错误雪崩
我无法弄清楚我的代码有什么问题。Boost 的模板让我发疯了!我无法从这一切中得出正面或反面,所以我只好问了。
这有什么问题?
错误的数量是巨大的;我会建议那些想在他们的 on 上帮助编译这个的人(相信我,在这里粘贴是不切实际的)。我正在使用最新的 TDM-GCC 版本(GCC 4.4.1)和 Boost 版本 1.39.00。
作为奖励,我想问另外两件事:C++0x 的新static_assert
功能是否会在这个意义上帮助 Boost,以及我上面引用的实现是否是一个好主意,或者我是否应该使用 Boost 的字符串算法库. 后者可能会提供更好的性能吗?
谢谢。
- 编辑
以下非常小的示例首先失败,并出现与上面的代码完全相同的错误。
-- 编辑 2
我仍然不知道为什么它在我的旧版本 Boost (1.39) 中不起作用,但是升级到 Boost 1.42 解决了这个问题。以下代码在 Boost 1.42 中完美编译和运行:
感谢您的提示,hkaiser。