问题标签 [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 的序列规则变得贪婪?
我正在研究一种Marpa::R2
将文本中的项目分组的语法。每个组只能包含某种类型的项目,但没有明确分隔。这会导致问题,因为x...x
(其中.
表示可以成为组一部分的项目)可以分组为x(...)x
, x(..)(.)x
, x(.)(..)x
, x(.)(.)(.)x
。换句话说,语法是高度模棱两可的。
x(...)x
如果我只想要解析,即如果我想强制+
量词只表现“贪婪”(就像在 Perl 正则表达式中所做的那样),我该如何消除这种歧义?
在下面的语法中,我尝试rank
在顺序规则中添加副词以优先Group
于Sequence
,但这似乎不起作用。
下面是一个练习这种行为的测试用例。
测试用例的输出(FAIL):
perl - Marpa 解析器库是否支持错误恢复?
我知道Perl 的“Marpa” Earley 解析器有很好的错误报告。
但我无法在其文档中或通过谷歌搜索找到它是否有错误恢复。
例如,大多数 C/C++ 编译器都有错误恢复功能,它们用于报告多个语法错误,而其他编译器通常会在第一个错误处停止。
我实际上是在解析自然语言,想知道是否有办法在输入的一部分失败后重新同步和恢复解析。
例如,对于那些可以理解它的人:
我正在解析老挝语的音节。在老挝语中,一些元音是变音符号,它们被编码为单独的字符并呈现在前一个辅音之上。在解析老挝维基百科的随机文章时,我遇到了一些这样的元音加倍的文本。这在老挝语正字法中是不允许的,所以一定是错字。但我知道在几个字符内,文本又好了。
无论如何,这是一个真实的例子,它激起了我对错误恢复或与令牌流重新同步的普遍兴趣。
perl - 使用 Perl Marpa 丢弃和跳过非结构化文本?
我正在使用 Marpa::R2::Scanless::G 来解析旧文本文件格式。文件格式顶部有一个结构良好的部分,然后是结构不良的文本和 uuencoded 内容。后面的东西可以完全忽略,但我不知道如何告诉 Marpa SLIF 界面:你完成了;不要打扰剩下的文字。
简而言之,文件可能如下所示:
我已经从顶部解析出了所有需要的数据,但是如果我不尝试匹配它,当它到达底部垃圾时,我得到:SLIF 解析中的错误:解析已用尽,但词位仍然存在。
我不知道如何设计一个术语来表示可能会吞下数兆字节的废话,不管遇到什么文本,只要继续到文件的末尾即可。我尝试使用 :discard 或 'pause => after' 时运气不佳,尽管我可能会误用它们。
对于上下文,我对解析和词法分析没有深入的了解。我敲敲语法直到它奏效。
ambiguity - 如何“沿着” Marpa 解析森林而不是“通过”它的解析树进行迭代?
假设我有一个很好的模棱两可的 Marpa 语法和一个很好的模棱两可的输入字符串。
我可以用 Marpa 解析字符串并最终得到一个解析森林。我什至可以遍历森林中的每个解析树。
但是我怎样才能“沿着”解析森林进行迭代呢?
描述我的意思:
解析森林是一种图,它可以具有备选方案分离的节点,以及备选方案重新组合成“主流”的节点。
假设这些是一个解析森林的替代解析树:
A B1 C
A B2 C
A B3 B4 C
有一个主流A
......C
但是一个模棱两可的B
部分。
当然,在现实世界的解析中,分支可能有许多级别的分支,并且可能存在不重新加入单个主流的流。但总的来说,两种或多种解释会有很多共同的部分。
可以使用哪些方法沿着明确和不明确的节点链进行迭代?
事实上我可以输出整个图表吗?
perl - Marpa: Can I explicitly disallow keywords as identifiers?
I'm implementing a new DSL in Marpa and (coming from Regexp::Grammars) I'm more than satisfied. My language supports a bunch of unary and binary operators, objects with C-style identifiers and method calls using the familiar dot notation. For example:
foo.has(bar == 42 AND baz == 23)
I found the prioritized rules feature offered by Marpa's grammar description language and have come to rely on that a lot, so I have nearly only one G1 rule Expression
. Excerpt (many alternatives, and semantic actions omitted for brevity):
As you can see, I'm using the Scanless interface (SLIF). My problem is that this also parses, for example:
Marpa knows that there can only be an identifier after a dot, so it doesn't even consider the fact that AND
might be a keyword. I know that I can avoid that problem by doing a separate lexing stage that identifies AND
as a keyword explicitly, but that tiny papercut is not quite worth the effort.
Is there a way in SLIF to restrict the Identifier
rule to non-keyword identifiers only?
lex - 如何使用 BNF 词法分析器识别和提取简单的嵌套标记?
我不知道如何获取有关此的文档。我刚刚发现大多数编译器都在使用 Backus-Naur 形式来描述一种语言。
从Marpa::R2
perl 包中,得到这个解析算术字符串的简单示例,例如42 * 1 + 7
:
我想修改它,以便递归地解析 XML 样例,例如:
并将其表达为:
我可以在哪里使用此功能:
对我来说是一个好的开始吗?
perl - 将哪些参数传递给 Marpa::R2 动作?
在Marpa::R2的cpan页面中,我了解 BNF(Backus-Naur 形式),但我对动作回调非常迷茫。
在下面的这个例子中,我知道左右两个成员被传递给do_multiply
. 对于那件事我没有任何疑问。问题是我找不到任何关于这些论点的文档?
$_[0]
甚至是什么$_[3]
?这是在哪里记录的?即使在官方 marpa 网站上,我也看不到任何文档。
在另一个示例中,这里是chobora的答案,我们看到它pair
指的是$_[2]
and $_[3]
:
BNF 的片段:
核心代码:
parsing - Python中表的自动检测/解析
我必须解析很多 UNIX CLI 输出,大多数时候,输出是一个表,但它们的列数/格式总是不同的......等等,我必须不断修改每个命令的解析代码。TxtFSM 让生活变得轻松,但我仍然需要编写模板。
我想编写一个脚本来自动检测 CLI 输出,当它检测到一个表时,它会解析它。作为解析世界的新手,我想知道这有多难/复杂?如果有人以前见过类似的努力/项目?
我总是对 BNF、YACC 等高级解析主题感到困惑
谢谢
perl - 是否可以将 Perl 的 Marpa 解析器用于公共网络服务器?
Perl 的Marpa解析器的文档包含以下有关污染数据的部分:
Marpa::R2 的存在是为了允许其输入以灵活而强大的方式改变执行。Marpa 不应与不受信任的输入一起使用。在 Perl 的污点模式下,将 Marpa 的 SLIF 接口与受污点的语法、受污点的输入字符串或受污点的标记值一起使用是一个致命错误。
我不确定,如果我了解此限制的后果。我明白,语法一定不能被污染。但我不明白输入一定不能被污染。对我来说,验证输入是解析器的任务。对我来说,解析器必须信任它的输入听起来不合理。
真的是这样吗?用 Marpa 实现任何一种公共网络服务是不可能的吗?
我问这个是因为其中一个参考用例是Marpa HTML 解析器,在我看来,使用 HTML 解析器是矛盾的,尽管大约 99.99% 的 HTML 可能被污染,但它不能用于受污染的数据。
任何人都可以解释这个矛盾吗?
perl - 匹配任意分隔符
我以前用 Marpa 解析复杂而愚蠢的旧文本格式取得了很好的成功,我正在尝试再做一次。
这种特殊格式有成百上千种不同的“开始”和“结束”块,如下所示:
我如何制定一条规则来匹配上述所有内容中的 BlahBlah、BarBar 和 FooFoo?我在任何示例中都看不到如何动态捕获令牌并重新使用它来终止规则,至少在标准无扫描语法示例中没有。我不想列举所有不同种类的块,因为新种类会破坏事物,我认为没有必要。
Begin/End 块的内容对问题无关紧要。实际上,这些东西是一个复杂的混乱,但没有什么我不知道如何度过难关。我对其他使 Marpa 成为一个很好的工具的复杂细节挥手致意,因此我不想求助于正则表达式。
至少,我试图实现的是块类型(即“BlahBlah”)到其内容的键值映射作为字符串。