问题标签 [marpa]

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 回答
369 浏览

perl - 可以用 Marpa 来加速 Perl 解释器的解析吗?

现有的Marpa解析器能否用于改进 Perl 5 的解析(例如,替换全部或部分现有 Perl 解释器的解析器)?

我在理论上提出问题,例如忽略实际考虑,例如“如果可以,将花费 10,000 工时”。

如果不是,阻止使用马尔巴的具体问题是什么?(再次,最好是理论上的)。

关于这为什么有趣的背景,Jeffrey Kegler(Marpa 的作者)于 2008 年在 PerlMonks 上发表了一篇颇有名气的文章“Perl 无法解析:正式证明”,该文章受到了他当时在 Marpa 上的工作的影响。

0 投票
1 回答
186 浏览

perl - 在语法中无法区分 G0 和 G1 规则

我试图让看起来非常基本的马尔巴语法工作。我使用的代码如下:

这打印$VAR1 = \'foo';。所以它可以很好地识别一个单词。但我想让它识别一串单词

现在脚本打印:

我认为这是因为ExprSingle使用了~(匹配)运算符,这使其成为标记级别 G0 的一部分,而不是结构级别 G1;该:discard规则允许 G1 规则之间有空格,而不是 G0 规则。所以我像这样改变语法:

现在不会打印任何警告,但结果值undef不是包含'foo'and的东西'bar'。老实说,我不确定这意味着什么,因为在此之前,失败的解析会引发实际错误。

我尝试更改语法以进一步区分我认为的 G0 和 G1 规则,但仍然没有运气:

最终值仍然是undeftrace_terminals显示 'foo' 和 'bar' 都被接受为标记。我需要做什么来修复这个语法(我的意思是获取一个包含字符串 'foo' 和 'bar' 而不是 just 的值undef)?

0 投票
1 回答
41 浏览

perl - 尝试阻止后的内部状态更改{}

我正在使用Marpa::R2,并尝试使用Try::Tiny捕获错误。我很困惑,因为当我将解析代码放入一个try块时,该value方法的结果是undef. 这是我的代码:

我有点疯狂地试图弄清楚语法是什么,然后我意识到删除try块会使值$reader->value非空。即使我$valuetry块内分配,它也会在块完成时变为undef

这似乎意味着如果我想用 捕获错误Try::Tiny,我必须将我的所有处理$value放入try块中,这很不方便。

谁能告诉我是什么原因造成的(我想解释一下这在 Perl 中是如何实现的)?有没有办法解决它?

0 投票
1 回答
143 浏览

perl - 使用 Marpa 进行不正确的标记化

我有一个相当大的 Marpa 语法(用于解析 XPath),并且遇到了标记化问题。我在下面创建了一个最小的破坏示例:

此脚本打印以下内容:

我希望将输入标记为[Child] [DoubleColon] [word]. 如终端跟踪所示,仅读取和处理一个冒号字符。似乎它试图将字符串的开头标记为[word] [':'] [word]并在中途失败。| word ':' word如果删除语法 ( )的第 10 行,将不再抛出该错误。

我尝试为 DoubleColon ( ) 创建优先级:lexeme ~ <DoubleColon> priority > 1,但没有奏效。有人能告诉我该怎么做才能使这个语法正确解析输入字符串吗?它仍然需要能够解析child::ns:book等。

0 投票
1 回答
139 浏览

regex - Marpa 中不区分大小写的匹配

与我之前关于使用正则表达式进行不区分大小写的关键字匹配的问题相关。

是否可以在Marpa中不区分大小写地匹配字符串?如果是这样,怎么做?

假设我有语法

如何使其匹配任何script,ScriptSCRIPT任何其他小写和大写字母组合?

0 投票
2 回答
428 浏览

perl - 在 Marpa::R2::Scanless 中防止天真的最长令牌匹配

在 Marpa 解析器中的无扫描接口(SLIF)的当前实现中,词法分析器似乎以下列方式进行最长标记匹配 (LTM):

  1. 所有终端符号都尝试匹配输入中的当前位置。
  2. 除了最长的匹配项之外的所有匹配项都被丢弃。
  3. 这些最长的令牌被提供给解析器,解析器可能接受也可能不接受。
  4. 如果不接受任何标记,则解析失败。

当我的语法包含与最长子字符串匹配但不能出现在当前位置的标记时,这会产生令人沮丧的解析失败。考虑以下代码:

这将产生输出:

预期输出:

!被识别后,key必须跟随一个令牌。在此位置进行词法分析期间,value令牌匹配最长的子字符串key:value,尽管它不会出现在此位置。因此,解析失败。

问题:是否有可能在编写手动词法分析器的情况下实现预期的输出?

(我知道词法分析器可以向识别器查询预期的标记,并且可以限制自己只匹配这些标记,但我不知道如何说服 SLIF 为我执行此操作。)

我在 perl5 v16.2 上运行 Marpa::R2 v2.064


编辑

按照 Jeffrey Kegler 的建议,我实现了一个规则,该规则将始终匹配比普通字符串更长的子字符串value,因此是首选。使用一个pause事件,我可以手动解析它,尽管我必须保留一个幻像规则以确保语义正确。

这是完整的更新代码,包括。事件处理和更新的测试用例:

这产生

这是预期的行为。

0 投票
1 回答
239 浏览

perl - Marpa::R2 泄漏内存

我正在使用最新版本的 marpa::r2 (Marpa-R2-2.065_002),它似乎很快就吃光了所有内存。我写了下面的脚本来测试它。

我能做些什么来防止内存泄漏?

编辑:这现在被报告为rt.cpan的错误。

编辑:现在已在 Marpa-R2 2.066000 版本中修复。谢谢

0 投票
1 回答
159 浏览

perl - 在 Marpa 语法中制作 0+ 长度列表的简洁方法?

我是玛尔巴的新手。我尝试了几种方法来描述我的语法中包含 0 个或多个术语的列表,并且我想避免使用多个解析树。

我的语言将只有 1 个组件,后跟 0+ 个子组件:

我首先尝试的是:

(完整代码在帖子末尾。)

这是我的输入:

我得到两个解析树,第一个带有不受欢迎的 undef,第二个我更喜欢。两者都将列表作为固有的树返回。

subcomponent-list 的可空规则是允许 0 个子组件的情况,但它在 1+ 个子组件列表的前面引入了 null 元素,这是一种替代解析。(玛尔巴只下轮一次,谢天谢地。)

我的另一个想法是使子组件列表不可为空,并引入一个中间规则,即 0 或 1 个子组件列表:

这至少消除了多重解析,但我仍然有一个循环,还有一个凌乱的嵌套树要压缩。

是否有更直接的方法来制作 0+ 长度列表或以其他方式使符号可选?

完整示例代码:

0 投票
1 回答
551 浏览

perl - Marpa 解析器似乎无法处理可选的第一个符号?

我已经掌握了 Marpa 解析器,并在第一个符号是可选的时遇到了问题。这是一个例子:

当我运行它时,我收到以下错误:

Perl 版本 5.14.2 (debian wheezy)
Marpa 版本 2.068000

(我看到有一个全新的 Marpa 2.069 我还没有尝试过)

这是我在语法上做错了吗?

0 投票
1 回答
203 浏览

perl - 在马尔巴语法中强制单词之间的间隙

我正在尝试设置一种语法,该语法要求如果[\w]字符不在同一个词位中,则它们不能直接相邻出现。也就是说,单词之间必须用空格或标点符号分隔。

考虑以下语法:

这样解析成功。现在我想更改语法以强制分隔9september。我想通过引入一个匹配的未使用的词位来做到这一点[\w]+

不幸的是,这个语法失败了:

虽然这可以通过使用lexeme default语句来解决:

这将产生以下输出:

也就是说,解析失败是因为两者之间没有差距,9september这正是我想要发生的。唯一美中不足的是,Inaccessible symbol: wordSTDERR 上有一条烦人的消息,因为word在实际语法中没有使用词位。

我看到Marpa::R2::Grammar我可以在构造函数选项中声明wordinaccessible_ok但我不能在Marpa::R2::Scanless.

我也可以做类似以下的事情:

然后使用 apause使用自定义代码检查实际的词位值并根据值返回适当的词位。

构建使用关键字或数字和单词但不允许相邻词位一起运行而没有空格或标点符号分隔它们的语法的最佳方法是什么?