问题标签 [parslet]

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.

0 投票
1 回答
141 浏览

ruby - Parslet 双重否定

解析引号和转义时(参见为什么 Parslet(在 Ruby 中)在解析空字符串文字时返回一个空数组?)我在 Parslet 中遇到了一个奇怪的问题:(escape_char.absent? >> str('"')).absent? >> any 似乎 Parslet 实际上解决了双重否定并期望转义字符在那里。

我对如何解决这个问题不太感兴趣,正如上面链接的帖子中已经描述的那样,我只是想了解这种行为。起初这似乎违反直觉,但我相信这背后有充分的理由。

0 投票
1 回答
289 浏览

ruby - 如何将 Parslet 与字符串而不是 Parslet 切片一起使用

我已经开始使用 Parslet 来解析一些自定义数据。在示例中,生成的解析数据类似于:

我已经创建了 Transform 之类的东西

但它不匹配,大概是因为我传递的是“data”@6 而不仅仅是“data”,而不仅仅是一个简单的字符串。Transform的所有示例都有字符串哈希,而不是解析器输出的 Parslet::Slices。也许我错过了一步,但我在文档中看不到任何内容。

编辑:更多示例代码(精简版,但仍应解释)

0 投票
1 回答
30 浏览

ruby - 如何让 Parslet 告诉失败的字符?

我在 Parslet 中有以下内容。

我有点困惑,因为原始字符串中没有两个斜线。为了帮助我调试,有没有一种方法可以输出特定的字符,最好是序数?还是我必须参考原始字符串?

0 投票
2 回答
199 浏览

ruby - 在 Parslet 中,如何从解析子树重构子字符串?

我正在为带有插值的名称-值参数的字符串编写解析器,例如:'This sentence #{x: 2, y: (2 + 5) + 3} has stuff in it.' 参数值是代码,它有自己的一组解析规则。

这是我的解析器的一个版本,简化为仅允许将基本算术作为代码:

由于代码有自己的解析规则(以确保语法有效),参数值被解析为子树(括号等替换为子树中的嵌套):

但是,我想将参数值存储为字符串,所以这将是理想的结果:

如何使用 Parslet 子树来重构参数值子字符串?我可以编写一个代码生成器,但这似乎有点过头了——Parslet 显然可以在某些时候访问子字符串的位置信息(尽管它可能会丢弃它)。

是否可以利用或破解 Parslet 来返回子字符串?

0 投票
2 回答
63 浏览

ruby - 以相同开头的规则的 Parslet 语法

我想提供一个解析器来解析所谓的 Subversion 配置身份验证文件(请参阅Subversion 红皮书中的基于补丁的授权)。在这里,我想为目录定义规则,例如

所以我有问题的语法部分是路径定义。我目前在 Parslet 中有以下规则:

所以我想分为两种情况:

  • 仅查找[/](根目录)
  • 在所有其他情况下[/<dir>],可能会重复,但必须在没有结束的情况下结束/

有问题的规则似乎是path定义了一个替代方案,这里/XOR 类似于/trunk

我已经为这些定义了测试用例,并在运行测试用例时收到以下错误:

所以问题似乎是,总是选择替代方案(规则:路径)top

这个问题的解决方案(作为语法)是什么?我认为应该有一个解决方案,这看起来像是从这里到那里应该发生的惯用语。我根本不是 PEG 解析器或解析器/编译器生成方面的专家,所以如果这是一个无法解决的基本问题,我也想知道这一点。

0 投票
1 回答
144 浏览

ruby - Ruby:parslet 用于系统 verilog 接口解析器

我正在使用Ruby::Parslet

我正在解析类似于 SV 接口的文档,例如:

这是我的解析器:

我在制定规则时遇到问题interface_body

它可以有0个或更多transmit行和 0 或 1protocol行以及多个空格、注释等。

有人可以帮帮我吗?我在代码片段中编写的规则适用于 singletransmit和 singleprotocol,即它们正确匹配,但是当我解析整个界面时它不起作用。

提前致谢。

0 投票
1 回答
367 浏览

ruby - Ruby & Lmstat:parslet 和结构化多行块:在哪里放置换行语句?

我有一个 Flexlm/Flexnet 许可服务,我想解析这个服务的输出。所有输出都是结构化的多行块。我的第一步是解析输出lmutil lmstat -c <port@server> -a以使用许可证和增量。

我尝试使用 Ruby 和 Parslet。所有行都被单独很好地解析。我有一个规则来解析特定类型的行的重复,但我无法解析结构化的行块。

我正在寻找定义在多行结构化块中放置“换行符”语句的位置的法律(在这种情况下比“规则”更好的词)。

我使用 Debian Jessie (stable/x86_64) 和 Ruby 2.1.5p273 和 Parslet 1.6.1-1。

我已经联系了作者,他很抱歉,但他没有足够的时间来帮助我。看到的网页是:

  • 网址:www.viget.com/articles/write-you-a-parser-for-fun-and-win
  • 网址:jmettraux.wordpress.com/2011/05/11/parslet-and-json/
  • 递归下降解析器 (Calle) - 视频
  • Wicked Good Ruby 2013 - Jason Garber 用 Parslet 编写 DSL - 视频
  • 包含块的多行方法链接的正确 Ruby 样式 - StackOverFlow
  • Ruby parslet:解析多行 - StackOverFlow
  • 如何使用 Parslet 在 Ruby 中处理 C 风格的注释?- 堆栈溢出

我花了很多时间试图了解如何构建多行结构化块的规则。下面是我的源代码,其中包含所有测试字符串和输出。

我的方法是构建:

  1. 解析线段的基本规则
  2. 解析没有“换行”语句的完整行的规则;
  3. 解析相同类型信息的重复的规则,例如已使用标记的行;
  4. 解析一组数据的规则:标题+行重复;
  5. 解析组重复的规则。

我不确定第3点,我完全迷失了“4”和“5”。

提前感谢您的帮助。[ 2017 年 7 月 14 日:删除了部分代码]

输出 [2017 年 7 月 13 日:删除以放置功能版本]

[更新 - 2017 年 4 月 29 日 - 问题已解决] 感谢 Nigel Thorne 的回答,它解决了我的问题。我已按照您的建议更正了“空间”的规则。

[ 2014 年 7 月 13 日:删除一些文本以放置功能齐全的版本。]

[更新 - 2017 年 7 月 13 日 - 应用程序测试解析]

我已经完成了一个应用程序来测试使用 Ruby 和 Parslet 解析 lmstat 的输出。由于解析取决于每个编辑器,因此可能无法涵盖某些情况,但使用了 30 多个许可证服务来验证解析。

我可以提供 3 个文件:

  1. parse_lmstat.rb:使用 './parse_lmstat --help' 获得帮助。用于测试解析的应用程序。
  2. readstdin_lmstat.rb : 从 STDIN 读取解析后的 lmstat 的 YAML 格式生成的输出。
  3. display_lmstat.rb:显示如何访问数据,它用于改进解析的结构。脚本简直比irb会话好。它使用 YAML 格式从 STDIN 读取已解析的 lmstat 输出。

一个例子 :

一个已知的错误:当 [CTRL-C] 完成时,信号似乎没有被很好地捕获,Ruby 在某些情况下会发送一些错误消息。

现在,我梦想拥有一个小型 WEB 应用程序(SINATRA?)来选择许可证服务器并显示数据,但我不会说 HTML 或 CSS ...任何帮助将不胜感激;-)

由于限制为 30000 个字符,您将在下面找到解析和转换 lmstat 输出的类。

0 投票
2 回答
103 浏览

ruby - Parslet 不解析整个字符串

对于以下 Parslet 解析器

它给出以下错误

如果我data rule

然后它按预期工作。

但是,我正在根据用户输入动态生成规则。所以这个解决方案对我不起作用。

提前致谢。

0 投票
2 回答
191 浏览

ruby - 使用 Parslet 和 Ruby 捕获转义的多行语法

我想用 Ruby 中的 Parslet 编写一个解析器,它理解一种简单的配置语法:

从解析器的角度来看,反斜杠转义了新行,因此解析时的beta值为twothree。反斜杠虽然在配置文件中(即上面的文本是直接表示 - 它不是您放在 Ruby 字符串引号内的内容)。在 Ruby 中,它可以表示为"alpha = one\nbeta = two\\\nthree\ngamma = four".

我目前的尝试适用于单行设置,但无法处理多行方法:

我想知道这个问题是否与 Parslet 解析事物的方式有关。我的价值规则的第一部分是否在不关心后面部分的上下文的情况下获取尽可能多的字符?

0 投票
1 回答
317 浏览

ruby-on-rails - 如何使用 ruby​​ 和 parslet 解析 rtf 文本?

我有来自富文本格式 (RTF) 文件的以下数据:

{\rtf1\ansi\deff3\adeflang1025\n{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial ;}{\f3\froman\fprq2\fcharset128 Times New Roman;}{\f4\fswiss\fprq2\fcharset128 Arial;}{\f5\fnil\fprq2\fcharset128 Droid Sans Fallback;}{\f6\fnil\fprq2\ fcharset128 DejaVu Sans;}{\f7\fswiss\fprq0\fcharset128 DejaVu Sans;}}\n{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}\n{\stylesheet{\s0\snext0 \nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af5\langfe2052\dbch\af6\afs24\lang1081\loch\f3\fs24\lang1033 默认;}\n{\s15\sbasedon0 \snext16\sb240\sa120\keepn\hich\af5\dbch\af6\afs28\loch\f4\fs28 标题;}\n{\s16\sbasedon0\snext16\sb0\sa120 正文;}\n{\s17\ sbasedon16\snext17\sb0\sa120\dbch\af7 列表;}\n{\s18\sbasedon0\snext18\sb120\sa120\noline\i\dbch\af7\afs24\ai\fs24 标题;}\n{\s19\sbasedon0\snext19\noline\dbch\af7 索引;}\ n}{\info{\creatim\yr2018\mo7\dy15\hr11\min52}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment OpenOffice}{\vern4140}}\deftab709\n\n{\*\pgdsctbl\n{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 默认;}}\n\formshade\paperh15840\paperw12240\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont \aftnstart1\aftnnrlc\n\pgndec\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af5\langfe2052\dbch\af6\afs24\lang1081\loch\f3 \fs24\lang1033{\rtlch \ltrch\loch\n我喜欢阅读。}\n\par }

按照 Rob Miller 的“Text Processing with Ruby”中的示例,我有以下 Parslet Parser:

使用上述 Parslet 解析 rtf 文件会产生:

(byebug) 解析 {:header=>{:rtf=>{:version=>"1"@5}, :charset=>"ansi"@7, :deff=>"\deff3"@11, :color_table= >nil}, :document=>[{:control_word=>{:word=>"adeflang"@18, :delimiter=>"1025"@26}}, {:text=>"\n"@30}, {:text=>"\n"@374}, {:text=>"\n"@431}, {:control_word=>{:word=>"deftab"@1050, :delimiter=>"709"@ 1056}}, {:text=>"\n\n"@1059}, {:text=>"\n"@1191}, {:control_word=>{:word=>"formshade"@1193, :delimiter =>nil}}, {:control_word=>{:word=>"paperh"@1203, :delimiter=>"15840"@1209}}, {:control_word=>{:word=>"paperw"@1215, :delimiter=>"12240"@1221}}, {:control_word=>{:word=>"margl"@1227, :delimiter=>"1134"@1232}}, {:control_word=>{:word=>"margr"@1237, :delimiter=>"1134"@1242}}, {:control_word=> {:word=>"margt"@1247, :delimiter=>"1134"@1252}}, {:control_word=>{:word=>"margb"@1257, :delimiter=>"1134"@1262}} , {:control_word=>{:word=>"sectd"@1267, :delimiter=>nil}}, {:control_word=>{:word=>"sbknone"@1273, :delimiter=>nil}}, { :control_word=>{:word=>"sectunlocked"@1281, :delimiter=>"1"@1293}}, {:control_word=>{:word=>"pgndec"@1295, :delimiter=>nil}} , {:control_word=>{:word=>"pgwsxn"@1302, :delimiter=>"12240"@1308}}, {:control_word=>{:word=>"pghsxn"@1314, :delimiter=>"15840"@1320}}, {:control_word=>{:word=>"marglsxn"@1326, :delimiter=>"1134"@1334}}, {:control_word=>{:word=>"margrsxn"@1339 , :delimiter=>"1134"@1347}}, {:control_word=>{:word=>"margtsxn"@1352, :delimiter=>"1134"@1360}}, {:control_word=>{:word= >"margbsxn"@1365, :delimiter=>"1134"@1373}}, {:control_word=>{:word=>"ftnbj"@1378, :delimiter=>nil}}, {:control_word=>{: word=>"ftnstart"@1384, :delimiter=>"1"@1392}}, {:control_word=>{:word=>"ftnrstcont"@1394, :delimiter=>nil}}, {:control_word=> {:word=>"ftnnar"@1405, :delimiter=>nil}}, {:control_word=>{:word=>"aenddoc"@1412, :delimiter=>nil}}, {:control_word=>{:word=>"aftnrstcont"@1420, :delimiter=>nil}}, {:control_word=>{:word=>"aftnstart"@1432, :delimiter=>"1"@1441}}, {:control_word=> {:word=>"aftnnrlc"@1443, :delimiter=>nil}}, {:text=>"\n"@1451}, {:control_word=>{:word=>"pgndec"@1453, :delimiter =>nil}}, {:control_word=>{:word=>"pard"@1460, :delimiter=>nil}}, {:control_word=>{:word=>"plain"@1465, :delimiter=> " "@1470}}, {:control_word=>{:word=>"s"@1472, :delimiter=>"0"@1473}}, {:control_word=>{:word=>"nowidctlpar"@1475 , :delimiter=>nil}}, {:control_word=>{:word=>"cf"@1529, :delimiter=>"0"@1531}}, {:control_word=>{:word=>"kerning" @1533,:分隔符=>"1"@1540}}, {:control_word=>{:word=>"hich"@1542, :delimiter=>nil}}, {:control_word=>{:word=>"af"@1547, :delimiter =>"5"@1549}}, {:control_word=>{:word=>"langfe"@1551, :delimiter=>"2052"@1557}}, {:control_word=>{:word=>"dbch "@1562, :delimiter=>nil}}, {:control_word=>{:word=>"af"@1567, :delimiter=>"6"@1569}}, {:control_word=>{:word=> "afs"@1571, :delimiter=>"24"@1574}}, {:control_word=>{:word=>"lang"@1577, :delimiter=>"1081"@1581}}, {:control_word= >{:word=>"loch"@1586, :delimiter=>nil}}, {:control_word=>{:word=>"f"@1591, :delimiter=>"3"@1592}}, {: control_word=>{:word=>"fs"@1594, :delimiter=>"24"@1596}}, {:control_word=>{:word=>"lang"@1599, :delimiter=>"1033"@1603}}, {:text=>"\n"@1643 }, {:control_word=>{:word=>"par"@1645, :delimiter=>" "@1648}}]}

RTF 文件中的任何文本,即“我喜欢阅读。”,都没有被解析,我不知道为什么。任何指导将不胜感激。