问题标签 [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.
perl - 可以用 Marpa 来加速 Perl 解释器的解析吗?
现有的Marpa解析器能否用于改进 Perl 5 的解析(例如,替换全部或部分现有 Perl 解释器的解析器)?
我在理论上提出问题,例如忽略实际考虑,例如“如果可以,将花费 10,000 工时”。
如果不是,阻止使用马尔巴的具体问题是什么?(再次,最好是理论上的)。
关于这为什么有趣的背景,Jeffrey Kegler(Marpa 的作者)于 2008 年在 PerlMonks 上发表了一篇颇有名气的文章“Perl 无法解析:正式证明”,该文章受到了他当时在 Marpa 上的工作的影响。
perl - 在语法中无法区分 G0 和 G1 规则
我试图让看起来非常基本的马尔巴语法工作。我使用的代码如下:
这打印$VAR1 = \'foo';
。所以它可以很好地识别一个单词。但我想让它识别一串单词
现在脚本打印:
我认为这是因为ExprSingle
使用了~
(匹配)运算符,这使其成为标记级别 G0 的一部分,而不是结构级别 G1;该:discard
规则允许 G1 规则之间有空格,而不是 G0 规则。所以我像这样改变语法:
现在不会打印任何警告,但结果值undef
不是包含'foo'
and的东西'bar'
。老实说,我不确定这意味着什么,因为在此之前,失败的解析会引发实际错误。
我尝试更改语法以进一步区分我认为的 G0 和 G1 规则,但仍然没有运气:
最终值仍然是undef
。trace_terminals
显示 'foo' 和 'bar' 都被接受为标记。我需要做什么来修复这个语法(我的意思是获取一个包含字符串 'foo' 和 'bar' 而不是 just 的值undef
)?
perl - 使用 Marpa 进行不正确的标记化
我有一个相当大的 Marpa 语法(用于解析 XPath),并且遇到了标记化问题。我在下面创建了一个最小的破坏示例:
此脚本打印以下内容:
我希望将输入标记为[Child] [DoubleColon] [word]
. 如终端跟踪所示,仅读取和处理一个冒号字符。似乎它试图将字符串的开头标记为[word] [':'] [word]
并在中途失败。| word ':' word
如果删除语法 ( )的第 10 行,将不再抛出该错误。
我尝试为 DoubleColon ( ) 创建优先级:lexeme ~ <DoubleColon> priority > 1
,但没有奏效。有人能告诉我该怎么做才能使这个语法正确解析输入字符串吗?它仍然需要能够解析child::ns:book
等。
regex - Marpa 中不区分大小写的匹配
与我之前关于使用正则表达式进行不区分大小写的关键字匹配的问题相关。
是否可以在Marpa中不区分大小写地匹配字符串?如果是这样,怎么做?
假设我有语法
如何使其匹配任何script
,Script
或SCRIPT
任何其他小写和大写字母组合?
perl - 在 Marpa::R2::Scanless 中防止天真的最长令牌匹配
在 Marpa 解析器中的无扫描接口(SLIF)的当前实现中,词法分析器似乎以下列方式进行最长标记匹配 (LTM):
- 所有终端符号都尝试匹配输入中的当前位置。
- 除了最长的匹配项之外的所有匹配项都被丢弃。
- 这些最长的令牌被提供给解析器,解析器可能接受也可能不接受。
- 如果不接受任何标记,则解析失败。
当我的语法包含与最长子字符串匹配但不能出现在当前位置的标记时,这会产生令人沮丧的解析失败。考虑以下代码:
这将产生输出:
预期输出:
!
被识别后,key
必须跟随一个令牌。在此位置进行词法分析期间,value
令牌匹配最长的子字符串key:value
,尽管它不会出现在此位置。因此,解析失败。
问题:是否有可能在不编写手动词法分析器的情况下实现预期的输出?
(我知道词法分析器可以向识别器查询预期的标记,并且可以限制自己只匹配这些标记,但我不知道如何说服 SLIF 为我执行此操作。)
我在 perl5 v16.2 上运行 Marpa::R2 v2.064
编辑
按照 Jeffrey Kegler 的建议,我实现了一个规则,该规则将始终匹配比普通字符串更长的子字符串value
,因此是首选。使用一个pause
事件,我可以手动解析它,尽管我必须保留一个幻像规则以确保语义正确。
这是完整的更新代码,包括。事件处理和更新的测试用例:
这产生
这是预期的行为。
perl - Marpa::R2 泄漏内存
我正在使用最新版本的 marpa::r2 (Marpa-R2-2.065_002),它似乎很快就吃光了所有内存。我写了下面的脚本来测试它。
我能做些什么来防止内存泄漏?
编辑:这现在被报告为rt.cpan的错误。
编辑:现在已在 Marpa-R2 2.066000 版本中修复。谢谢
perl - 在 Marpa 语法中制作 0+ 长度列表的简洁方法?
我是玛尔巴的新手。我尝试了几种方法来描述我的语法中包含 0 个或多个术语的列表,并且我想避免使用多个解析树。
我的语言将只有 1 个组件,后跟 0+ 个子组件:
我首先尝试的是:
(完整代码在帖子末尾。)
这是我的输入:
我得到两个解析树,第一个带有不受欢迎的 undef,第二个我更喜欢。两者都将列表作为固有的树返回。
subcomponent-list 的可空规则是允许 0 个子组件的情况,但它在 1+ 个子组件列表的前面引入了 null 元素,这是一种替代解析。(玛尔巴只下轮一次,谢天谢地。)
我的另一个想法是使子组件列表不可为空,并引入一个中间规则,即 0 或 1 个子组件列表:
这至少消除了多重解析,但我仍然有一个循环,还有一个凌乱的嵌套树要压缩。
是否有更直接的方法来制作 0+ 长度列表或以其他方式使符号可选?
完整示例代码:
perl - Marpa 解析器似乎无法处理可选的第一个符号?
我已经掌握了 Marpa 解析器,并在第一个符号是可选的时遇到了问题。这是一个例子:
当我运行它时,我收到以下错误:
Perl 版本 5.14.2 (debian wheezy)
Marpa 版本 2.068000
(我看到有一个全新的 Marpa 2.069 我还没有尝试过)
这是我在语法上做错了吗?
perl - 在马尔巴语法中强制单词之间的间隙
我正在尝试设置一种语法,该语法要求如果[\w]
字符不在同一个词位中,则它们不能直接相邻出现。也就是说,单词之间必须用空格或标点符号分隔。
考虑以下语法:
这样解析成功。现在我想更改语法以强制分隔9
和september
。我想通过引入一个匹配的未使用的词位来做到这一点[\w]+
:
不幸的是,这个语法失败了:
虽然这可以通过使用lexeme default
语句来解决:
这将产生以下输出:
也就是说,解析失败是因为两者之间没有差距,9
而september
这正是我想要发生的。唯一美中不足的是,Inaccessible symbol: word
STDERR 上有一条烦人的消息,因为word
在实际语法中没有使用词位。
我看到Marpa::R2::Grammar
我可以在构造函数选项中声明word
,inaccessible_ok
但我不能在Marpa::R2::Scanless
.
我也可以做类似以下的事情:
然后使用 apause
使用自定义代码检查实际的词位值并根据值返回适当的词位。
构建使用关键字或数字和单词但不允许相邻词位一起运行而没有空格或标点符号分隔它们的语法的最佳方法是什么?