问题标签 [boost-spirit-lex]
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::qi 规则与输入不匹配?
我尝试继续处理我之前的示例并扩展规则。我的问题是,使用 ID_IDENTIFIER 的规则不起作用——尽管我知道词法分析器正在工作(使用单元测试)。
这是示例:
ID_INTEGER 的类似规则匹配“1234”
c++ - 为什么这个 boost::spirit::qi 规则不起作用?
我有一个定义以下规则的语法:
我希望它匹配以下字符串:
测试[1] testident.ident
它不应该匹配
测试[1.2] testident.5
但它无法匹配前 2 个字符串。
词法分析器构造函数如下:
为什么我找不到上述字符串的匹配项?
谢谢托比亚斯
c++ - 使用 Spirit::qi 时如何忽略来自 spirit::Lex 的标记属性?
当我使用这个 qi 语法接受来自 Lex 的标记时:
结合此融合/元组映射以协助捕获:
一切正常。
但我想使用ID_MARKER
just 进行解析;我真的不需要或不想捕捉它。
所以我试图通过使用忽略该属性qi::lit
:
连同m_dummy
从捕获中删除,但我只是得到一堵模板错误墙。
我应该做什么来清理这个?
c++ - 如何让精神的 qi::as_string 与重复一起工作?
出于某种奇怪的原因,我无法qi::as_string[]
使用repeat()[]
.
解析std::string str = { "{ +100S+++ ;\n }" };
,我得到以下OUTPUT
这表明解析是好的,第一个+
被捕获,但不是随后的三个+++
。
注意我只是想three_plus_or_minus
连续捕获一到三个优点或缺点作为字符串。不使用的替代解决方案也as_string[]
将受到赞赏。
对于冗长的清单,我深表歉意,但我需要在我的真实代码中同时使用词法分析器和解析器。
代码
c++ - 转换为 token_def 的值类型
当我在词法分析器中定义时
然后在一些语法中使用它
那么如何将字符串转换为正确令牌值类型的值(unsigned int
在这种情况下)?如果您将自定义类型或浮点类型指定为令牌值类型,会发生什么情况?转换例程的存在在哪里(我认为类似于boost::iterator_range
转换double
)?
c++ - 使用 Boost.Spirit 解析标记化的自由形式语法
我一直在尝试为 callgrind 工具的输出创建一个 Boost.Spirit 解析器,它是 valgrind 的一部分。Callgrind 输出一种特定于领域的嵌入式编程语言 (DSEL),它可以让你做各种很酷的事情,比如合成计数器的自定义表达式,但它不容易解析。
我在https://gist.github.com/ned14/5452719#file-sample-callgrind-output放置了一些示例 callgrind 输出。我已经在https://gist.github.com/ned14/5452719#file-callgrindparser-hpp和https://gist.github.com/ned14/5452719对 Boost.Spirit 词法分析器和解析器进行了目前的最佳尝试#file-callgrindparser-cxx。Lexer 部分很简单:它将标记值、非空白文本、注释、行尾、整数、十六进制、浮点数和运算符(忽略示例代码中的标点符号,它们未使用)。空白被跳过。
到目前为止,一切都很好。问题是解析标记化的输入流。我什至还没有尝试过主要的节,我仍在尝试解析可能出现在文件中任何位置的标记值。标签值如下所示:
它可以是自由格式的文本,例如
在这种情况下,您希望将标记集转换为字符串,即转换为 iterator_range 并提取。
然而,它可能是一个表达式,例如
这表示从现在开始,事件 EPpsec 将被合成为 Ir 乘以 316 添加到 I1mr 乘以 1120 添加到 ... 等等。
我想在这里说明的一点是,标签-值对需要作为任意标记集进行累积,并后处理为我们以后将它们变成的任何内容。
为此,Boost.Spirit 的 utree() 类看起来正是我想要的,这就是示例代码所使用的。但是在 VS2012 上使用带有可变参数模板的 11 月 CTP 编译器,我目前看到这个编译错误:
...这表明我的 base_iterator_type 是 Boost.Spirit multi_pass<> 包装的 istreambuf_iterator 用于前向迭代器性质,Boost.Spirit 的 utree() 实现不知何故无法理解。问题是,我不确定这是我的错误代码还是错误的 Boost.Spirit 代码,因为 line_pos_iterator<> 未能正确指定其 forward_iterator 概念标签。
感谢过去的 Stackoverflow 帮助,我可以编写一个纯非标记化的语法,但它会很脆弱。正确的解决方案是标记化并使用能够相当任意输入的自由格式语法。让 Boost.Spirit 的 Lex 和 Grammar 在现实世界的示例而不是玩具示例中协同工作的示例数量非常少。因此,任何帮助将不胜感激。
尼尔
c++ - 如何用 Spirit::lex 去除令牌中的转义字符?
我想标记我自己的 SQL 语法扩展。这涉及识别双引号字符串中的转义双引号。例如,在 MySQL 中,这两个字符串标记是等价的:(""""
第二个双引号充当转义字符)和'"'
. 我尝试了不同的方法,但我被困在如何替换代币的价值上。
那么如何将令牌的值设置为何"
时""
找到呢?
除此之外,我还有以下问题:我可以为语义操作编写一个函子来调用 ctx.more() 并同时忽略该标记(从而将“低级”标记组合成“高级”字符串标记)。但是如何优雅地将它与 lex::_state = ".." 结合起来呢?
c++ - 无法编译使用 Phoenix actor 更改令牌值的 boost-spirit 示例
当我尝试编译下面的代码(使用示例boost\spirit\home\lex\argument.hpp: value_setter
)时,我收到以下编译器错误:
没有语义动作,一切都编译得很好。这是示例:
出了什么问题?如何设置/更改令牌的值?
c++ - 如何对 Boost Spirit Parser 进行基准测试?
我正在开发一个编译器,我想提高它的性能。我发现大约 50% 的时间用于解析源文件。由于源文件很小,之后我做了很多转换,在我看来它是完美的。
我的解析器是一个带有词法分析器(带有 lexer::pos_iterator)的 Boost Spirit 解析器,我有一个中等大小的语法。我正在将源解析为 AST。
我的问题是我不知道在解析过程中花费最多时间的是什么:AST 节点、词法分析器、解析器规则或内存的副本。
我不认为这是 I/O 问题,因为我正在使用 SSD,并且我在开始时完全读取文件,然后仅使用内存版本。
我尝试使用分析器,但需要时间的方法是来自 Boost 的一些方法,它们的名称有数百个字符长,我不知道它们到底做了什么......
那么,有没有一种首选的方法来对 Boost Spirit Parser 及其语法进行基准测试?或者是否有一些规则可以用来验证某些特定点的效率?
谢谢
感兴趣的人的来源:
c++ - 使用 Boost Spirit 解析语法的未处理异常
我正在尝试使用Boost Spirit来解析以下语法:句子:名词动词句子连词句子
连词:“和”
名词:“鸟”“猫”
动词:“飞”“喵”
当语法只包含名词>>动词规则时,解析成功。当语法被修改为包含句子>>连词>>句子规则并且我提供了一个无效的输入,例如“birds fly”而不是“birdsfly”时,我在程序运行时得到一个未处理的异常。
这是从 boost doc 上的示例修改的代码