问题标签 [peg]
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.
ruby - 针对每行上的多个(15+)正则表达式解析文本正文的最佳方法是什么?
我有一段必须扫描的文本,每行至少包含 2 部分,有时包含 4 部分信息。问题是每行可以是 15-20 个不同动作中的 1 个。
在 ruby 中,当前代码看起来有点像这样:
这显然是“问题”。我确实设法通过将所有正则表达式组合成一个来使其更快(在 C++ 中提高 50%),但这仍然不是我需要的速度——我需要快速解析数千个这些文件!
现在我将它们与正则表达式相匹配——但这太慢了。我从 ruby 开始,然后跳到 C++,希望能提高速度,但它并没有发生。
我随便阅读了有关 PEG 和基于语法的解析,但它看起来有点难以实现。这是我应该去的方向还是有不同的路线?
基本上我正在解析扑克手牌历史,手牌历史的每一行通常包含我需要收集的 2-3 位信息:玩家是谁,多少钱或行动需要什么牌......等等。
需要解析的示例文本:
在我收集了这些信息之后,每个动作都会变成一个 xml 节点。
现在我的 ruby 实现比我的 C++ 快得多,但这很可能。只是因为我已经 4 到 5 年没有用 c 代码编写了
更新: 我不想在这里发布所有代码,但到目前为止,我的手/秒如下所示:
我目前正在测试 antlr,看看我们是否可以走得更远,但到目前为止,我对 Spirit 的结果非常满意。
相关问题:针对多个正则表达式有效地查询一个字符串。
parser-generator - PEG 语法和解析器生成器的局限性?
我非常喜欢使用 YARD:
http://code.google.com/p/yardparser/
http://www.codeproject.com/KB/recipes/yard-tokenizer.aspx
我能够构建功能齐全的计算器。我正在评估 YARD 来做 PHP 解析器。请就 PEG 语法和解析器生成器的限制提出建议。非常感谢你!
javascript - 使用 PEG.js 的简单解析问题
我试图通过将简单的语法输入到PEG.js playground中来围绕 PEG 。
示例 1:
- 输入:
"abcdef1234567ghijklmn8901opqrs"
期望的输出:
["abcdef", "1234567", "ghijklmn", "8901", "opqrs"]
实际输出:
["abcdef", ["1234567", ["ghijklmn", ["8901", ["opqrs", ""]]]]]
这个例子非常有效,但我可以让 PEG.js 不将结果数组嵌套到一百万级吗?我认为诀窍是使用concat()
而不是join()
某处,但我找不到那个地方。
示例 2:
与示例 1 相同的问题和代码,但将 Characters 规则更改为以下内容,我预计这会产生相同的结果。
结果输出是:
为什么我得到所有这些空匹配?
示例 3:
最后一个问题。这根本行不通。我怎样才能让它工作?对于奖励积分,任何关于效率的指示?例如,如果可能的话,我应该避免递归吗?
我也很感激一个好的 PEG 教程的链接。我已阅读(http://www.codeproject.com/KB/recipes/grammar_support_1.aspx),但如您所见,我需要更多帮助...
- 输入:
'abcdefghijklmnop"qrstuvwxyz"abcdefg'
- 期望的输出:
["abcdefghijklmnop", "qrstuvwxyz", "abcdefg"]
- 实际输出:
"abcdefghijklmnop\"qrstuvwxyz\"abcdefg"
regex - 为文本编辑器定义语法的最佳方法是什么?
我正在为 Mac 编写一个开源文本编辑器,终于达到了我想要添加语法高亮的地步。在过去的几天里,我一直在反复讨论各种解决方案,最后我决定向更广泛的受众开放这个问题。
以下是我看到的选项:
- 基本上用一系列正则表达式模式匹配来定义语言(类似于 TextMate 定义其语言的方式)
- 使用BNF 或 PEG 等形式语法定义语言
使用正则表达式模式匹配似乎不太理想,因为它不能像正式语法一样正式地表示一种语言;然而,一些不太正式的语言将很难适应 BNF(即 Markdown——尽管我知道有一个很棒的PEG 实现)。
实时语法突出显示的性能权衡是什么?多种语言的灵活性如何?
如果我走 BNF 路线,Todd Ditchendorf 创建了很棒的ParseKit框架,它可以很好地开箱即用。有人知道PEG有什么类似的吗?
parsing - 用于 Python 样式缩进的 PEG
您将如何在以下任何可以处理 Python/Haskell/CoffeScript 样式缩进的解析器生成器(PEG.js、Citrus、Treetop )中编写解析表达式语法:
尚不存在的编程语言的示例:
更新: 不要尝试为上面的示例编写解释器。我只对缩进问题感兴趣。另一个示例可能是解析以下内容:
parsing - 任何能够处理左递归的 PEG 解析器?
好吧,我知道可以重写语法以消除左递归。但这是一个非常无聊的过程,有时保持正确的关联性非常重要。是否有任何解析器能够通过左递归正确处理语法?
ruby - Treetop ruby 解析器 - 无法解析有序选择
我已经定义了使用 Treetop 解析字符串和数字的简单语法,如下所示。
红宝石:
我希望解析器返回字符串节点,但看起来解析器无法理解输入。任何想法将不胜感激。
c++ - Windows 操作系统上的 PEG 解析器库
是否有适用于 Windows 的解析表达式语法 (PEG) C++ 库?我尝试用 MS Visual Studio 编译 pegc/legc、pegc 是徒劳的。:(
regex - PEG和CFG有什么区别?
从这个维基百科页面:
上下文无关文法和解析表达式文法的根本区别在于 PEG 的选择运算符是有序的。如果第一个备选方案成功,则第二个备选方案将被忽略。因此,有序选择不是可交换的,这与上下文无关文法和正则表达式中的无序选择不同。有序选择类似于某些逻辑编程语言中可用的软切运算符。
为什么 PEG 的选择算子会短路匹配?是因为尽量减少内存使用(由于记忆)?
我不确定正则表达式中的选择运算符是什么,但让我们假设它是这样的:/[aeiou]/
匹配元音。所以这个正则表达式是可交换的,因为我可以用 5 个中的任何一个来写它!(五个阶乘)元音字符的排列?ie/[aeiou]/
的行为与/[eiaou]/
. 它是可交换的有什么好处?(参见 PEG 的不可交换性)
结果是,如果将 CFG 直接音译为 PEG,则通过从可能的解析中确定性地选择一棵解析树来解决前者中的任何歧义。通过仔细选择指定语法替代方案的顺序,程序员可以很好地控制选择哪个分析树。
这是说 PEG 的语法优于 CFG 的吗?
pyparsing - 在pyparsing中需要确认PEG的语义谓词
PEG论文描述了两种语义谓词解析表达式:
- 和谓词
&e
- 非谓词
!e
pyparsing 是否支持 And 谓词?或者这只是排序解析表达式的同义词?在这种情况下,它应该等同于And
类。正确的?
是否NotAny
代表 Not 谓词?
具体来说,它们是否符合规范的行为:
解析表达式 foo &(bar) 匹配并使用文本“foo”,但前提是它后面跟着文本“bar”。解析表达式 foo !(bar) 匹配文本“foo”,但前提是它后面没有文本“bar”。表达式 !(a+ b) a 匹配单个“a”,但前提是它不是 a 后跟 a b 的任意长序列中的第一个。