- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试为 callgrind 工具的输出创建一个 Boost.Spirit 解析器,这是 valgrind 的一部分。 Callgrind 输出一种领域特定的嵌入式编程语言 (DSEL),它可以让您做各种很酷的事情,例如合成计数器的自定义表达式,但它不容易解析。
我在 https://gist.github.com/ned14/5452719#file-sample-callgrind-output 放置了一些示例 callgrind 输出.我已经将我目前最好的尝试放在 Boost.Spirit 词法分析器和解析器上 https://gist.github.com/ned14/5452719#file-callgrindparser-hpp和 https://gist.github.com/ned14/5452719#file-callgrindparser-cxx . Lexer 部分很简单:它对标记值、非空白文本、注释、行尾、整数、十六进制、 float 和运算符进行标记(忽略示例代码中的标点符号,它们未被使用)。跳过空白。
到目前为止一切顺利。问题是解析标记化的输入流。我什至还没有尝试过主要节,我仍在尝试解析可能出现在文件中任何 点的标记值。标记值如下所示:
tagtext: unknown series of tokens<eol>
它可以是自由格式的文本,例如
desc: I1 cache: 32768 B, 64 B, 8-way associative, 157 picosec hit latency
在这种情况下,您希望将标记集转换为字符串,即转换为 iterator_range 并提取。
它也可以是一个表达式,例如
event: EPpsec = 316 Ir + 1120 I1mr + 1120 D1mr + 1120 D1mw + 1362 ILmr + 1362 DLmr + 1362 DLmw
这表示从现在开始,事件 EPpsec 将被合成为 Ir 乘以 316 加到 I1mr 乘以 1120 加到...等。
我想在这里强调的一点是,标签-值对需要作为任意标记集累积,并进行后处理,以便我们稍后将它们变成任何东西。
为此,Boost.Spirit 的 utree() 类看起来正是我想要的,这就是示例代码所使用的。但是在 VS2012 上使用带有可变参数模板的 November CTP 编译器我目前看到这个编译错误:
1>C:\Users\ndouglas.RIMNET\documents\visual studio 2012\Projects\CallgrindParser\boost\boost/range/iterator_range_core.hpp(56): error C2440: 'static_cast' : cannot convert from 'boost::spirit::detail::list::node_iterator<const boost::spirit::utree>' to 'base_iterator_type'
1> No constructor could take the source type, or constructor overload resolution was ambiguous
1> C:\Users\ndouglas.RIMNET\documents\visual studio 2012\Projects\CallgrindParser\boost\boost/range/iterator_range_core.hpp(186) : see reference to function template instantiation 'IteratorT boost::iterator_range_detail::iterator_range_impl<IteratorT>::adl_begin<const Range>(ForwardRange &)' being compiled
1> with
1> [
1> IteratorT=base_iterator_type
1> , Range=boost::spirit::utree
1> , ForwardRange=boost::spirit::utree
1> ]
... 这表明我的 base_iterator_type 是 istreambuf_iterator 的 Boost.Spirit multi_pass<> 包装,用于前向迭代器性质,Boost.Spirit 的 utree() 实现无法理解。问题是,我不确定这是我的错误代码还是错误的 Boost.Spirit 代码,因为 line_pos_iterator<> 未能正确指定其 forward_iterator 概念标签。
感谢过去的 Stackoverflow 帮助,我可以编写一个纯非标记化语法,但它会很脆弱。正确的解决方案是标记化并使用能够相当任意输入的自由格式语法。令人遗憾的是,让 Boost.Spirit 的 Lex 和 Grammar 在现实世界的例子中一起工作来实现这一点的例子比玩具例子少得多。因此,我们将不胜感激任何帮助。
尼尔
最佳答案
token 属性公开了一个变体,除了基本迭代器范围之外,它还可以_assume 在 token_type
typedef 中声明的类型:
typedef lex::lexertl::token<base_iterator_type, mpl::vector<std::string, int, double>> token_type;
因此:string
、int
和 double
。但是请注意,当解析器实际 使用该值时,强制 到其中一种可能的类型只会延迟发生。
utree
是一个非常通用的容器[1]。因此,当您在规则上公开 spirit::utree
属性,并且标记 value variant 包含 iterator_range 时,它会尝试将其分配到 utree
对象(这失败了,因为迭代器是......'funky')。
获得所需行为的最简单方法是强制 Qi 将tag
标记的属性解释为字符串,并让that 分配给 utree
。因此,以下行构成了使编译成功的修复:
unknowntagvalue = qi::as_string[tok.tag] >> restofline;
说了这么多,我确实会提出以下建议
考虑使用 Nabialek Trick
根据匹配的 tag
分派(dispatch)不同的惰性规则 - 这样就没有必要处理原始 utree
稍后
您可能已经成功地专门化了 boost::spirit::traits::assign_to_XXXXXX
特征(参见 documentation)
考虑使用纯 Qi 解析器。虽然我可以“感觉到”你的情绪“它会变脆”[2],但你似乎已经证明它会把复杂性 boost 到这样的程度,以至于它可能没有净值(value):
词法分析器标记语义操作
可靠地工作,而通常, 消歧会发生在Qi 阶段但我发散了:)
[1] 例如它们具有非常轻量级的迭代器范围“引用”功能(例如符号,或者避免将字符从源缓冲区复制到属性中,除非需要)
[2] 实际上,只是因为使用顺序词法分析器(扫描器)大大减少了回溯机会的数量,所以它简化了解析器的心智模型。但是,您可以使用 期望点
来达到几乎相同的效果。
关于c++ - 使用 Boost.Spirit 解析标记化的自由形式语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16196065/
虽然我在 reactjs 组件(组件名称为 renderLocationLink)的渲染方法返回的 html 中包含了 a 标签的 onclick 处理程序,但渲染正确地发生了 onclick 处理程
我必须以 docx 格式存储一些文档,但无法忍受使用 msword:我想编辑某种纯文本标记,除了基于 XML 的东西(我也不喜欢那样)和从/到那个到/从 docx 转换。 有什么选择吗? 编辑:由于人
有一个页面,其 anchor 标记在延迟后变得可点击。我想使用用户脚本在可点击后点击它。 页面加载时,HTML 源代码为: Download 延迟一段时间后,#button 变
我正在将 XML 文件解析为 pandas 数据帧。使用下面的代码我可以成功获取所有内容,但是这使用了完整 XML 的编辑版本。完整的 XML 在主数据表之上有一堆摘要数据,请参阅完整的 XML he
目前我正在研究 xml.sax 解析器来解析 xml 文件 假设我有以下代码 filepath = 'users/file.xml' try: parser = xml.sax.make_pa
我正在尝试构建一种语法来解释用户输入的文本,搜索引擎风格。它将支持 AND、OR、NOT 和 ANDNOT bool 运算符。我几乎所有东西都在工作,但我想添加一个规则,将引用字符串之外的两个相邻关键
我遇到了 Terraform EKS 标记的问题,并且似乎没有找到可行的解决方案来在创建新集群时标记所有 VPC 子网。 提供一些上下文:我们有一个 AWS VPC,我们在其中将多个 EKS 集群部署
我是xpath的新手,对此了解不多。我知道有一种方法可以使用xpath在xml / xhtml文件中查找特定标签。就我而言,我试图找到第一个(a)链接元素。不幸的是,我的xpath字符串[// a [
我在索引页上的产品卡上遇到问题。在产品卡内部,我有 Vue 组件来渲染表单(数量和添加到购物车按钮)。当我单击“添加到购物车”按钮时,我得到了预期的结果。响应被发送到根 vue 组件,然后我看到产品已
html setMouse(true)} onMouseEnter={() => setMouse(false)} className='resume-container'> CSS .resum
我在组件中有一组枚举,如下所示: type TOption = (clVisible, clVisibleAlways, clRenderable, clEditable); TOptions
是否有出于性能考虑的javadoc标签? 人们可以想象: /** * ...other javadoc tags... * @perform Expected to run in O(n) tim
html setMouse(true)} onMouseEnter={() => setMouse(false)} className='resume-container'> CSS .resum
我有一个包含多个小子图的图。目标是当且仅当子图中的所有节点都是蓝色时,才将子图中的所有蓝色节点标记为红色。如果子图中的一个节点具有不同的颜色,绿色,那么我们将不会更改该子图中节点的颜色。 这是我正在使
我正在使用 json-ld 开发事件标记以包含在确认电子邮件中。 我的一些事件会定期重复发生。但是,最新的 Schema.org 规范不支持重复发生的事件,因此我遵循了此处提供的建议:http://l
我创建了一个插件,可以添加带有相应行号的标记。现在,这很棒,因为它现在显示在“标记” View 中。有没有办法当我双击标记上的一行时,它会转到标记指示的行? 谢谢。 最佳答案 双击“标记” View
是否有一个插件具有与 Facebook 标记类似的行为? 它的特别之处在于它具有: 在键入的单词之间自动完成 特殊输出的 html(与另一个输入字段同步) 最佳答案 您可以使用jquery提及输入pl
有没有更好的方法来读取java文件中的 token ?我目前正在使用 StringTokenizer 来分割 token 。但在大多数情况下,它的效率可能非常低,因为您必须逐个 token 地读取 t
我想知道是否有某种方法可以标记文件来识别该文件是否包含x。 考虑以下示例: 在批量转换过程中,我正在创建一个日志文件,其中列出了各个转换的成功/失败。 所以流程如下: 开始转换过程 创建名为batch
我一直在尝试模拟点击标签,但这并没有像我需要的那样工作。我的 anchor 标记看起来像这样 Download this pic 正常的 $("a").click() 或 trigger('cli
我是一名优秀的程序员,十分优秀!