问题标签 [parser-combinators]
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.
regex - 如何限制 Regex 和 Parser 组合器中的 nestead 标记?
我想实现一个简单的类似 Wiki 的标记解析器,作为使用 Scala 解析器组合器的练习。
我想一点一点地解决这个问题,所以这是我想在第一个版本中实现的:一个简单的内联文字标记。
例如,如果输入字符串是:
输出字符串应该是:
我尝试通过使用来解决这个问题RegexParsers
,这就是我现在所做的:
在此代码中,仅包含一个<code>
标记的更简单的输入可以正常工作,例如:
变得
但是当我用上面的例子运行它时,它会产生
我认为这是因为我使用的正则表达式:
允许``
成对的任何字符。
我想知道我是否应该限制无法嵌套``
并解决此问题?
scala - 斯卡拉。困难的表达式解析器。内存不足错误
我想为具有操作顺序的困难表达式创建一个解析器。我有一些例子,但它工作得非常缓慢并抛出异常 OutOfMemoryError。我该如何改进它?
parsing - 基于层数的递归解析
我有一个棘手的问题(至少在我看来),关于 Scalas 解析器组合器和递归解析。我目前正在构建一个小型解析器,它应该能够解析这样的 PL/1 结构:
在这种情况下,我想构建一个 AST,如下所示:
这意味着父元素应该连接到它的子元素。在我的世界中,这应该以某种方式导致递归解析器,但是我的问题是如何控制何时停止在子级别中下降。例如,在解析“3 subdata”记录结构时,它应该在遇到本身不低的级别数时停止,在本例中为“3 subData2”行。
有人可以帮助解决这个问题,或者指出一个好的方向。我目前的解决方案是在解析一个未连接的结构后解决这个问题。
提前致谢。
问候斯特凡
java - 强制正则表达式匹配可选组
我想在文本中搜索字符串“W foo X bar Y baz Z”。W,X,Y,Z 是不重要的分隔符,我不能搜索它们。foo、bar 和 baz 是我感兴趣的词。顺序并不重要。我想知道我要求的单词在文本中出现的“好”程度。
我正在尝试以下
我的理由是:
- 将每个单词打包在一个可选组中,因此不需要出现 [ (?: 是一个非捕获组,\Q...\E 只是转义]
- 用 .{0,3} 分隔每个单词(任何字符,出现 0-3 次)
此 Regex 始终匹配,因为它仅包含可选组,但结果匹配始终为空,即使它可以完全匹配所有可选组。但是,我想对结果匹配进行后处理,所以我需要它尽可能多地捕获。
我可以强制正则表达式尽可能匹配所有组吗?
或者你知道如何完成对几个单词的搜索,用一些东西分隔,然后检查哪些单词出现以计算一些相似度?
非常感谢
scala - scala组合器解析器保留原始输入
我想从另一个解析器组成一个解析器,以将消耗的输入作为 ast 构造的参数。
说我有
我正在寻找的是一种让另一个解析器构造以下元素的方法:
所以我正在寻找一种方法来检索合成中解析器的原始消费输入。也许是这样的:
我猜这种情况下的签名是:
有没有另一种简单的方法来获得我想要的东西,或者我需要写那个东西?感觉这可能是一个更好的方法......</p>
parsing - 用于(几乎)普通语法的 Scala 解析器组合器
我一直在尝试为一种(非常)简单的语言制作一个解析器,如下所示:
我可以使用正则表达式将其分开:
这基本上会一直吃字符,直到它找到匹配的东西 [^ ]*?\\{
或\\}
:块的开始或结束。我的问题是,如果我想使用 Scala 的 Parser Combinators 来做到这一点,我该怎么做?我目前有:
但这不起作用:
似乎block
解析器没有触发,因此text
解析器被反复触发。但是当我删除text
解析器时:
我得到:
所以很明显block
解析器确实有效,除非当text
解析器存在时。发生了什么?对于如此基本的语法,是否有一种“正确”的方式来做到这一点?
编辑:更改了标题,因为与其说是不情愿,不如说是解决问题
编辑:我现在有这个:
这背后的逻辑是,对于每个字符,它都会测试它是否是一个块的开始。如果不是,它会移动到下一个字符。这给了我:
这是正确的。它正在逐一解析非块字符,这可能是一个性能问题(我认为?)。有没有办法一次解析所有这些非块字符并将它们留在一个大字符串中?
parsing - Scala解析器组合器:检索解析器使用的原始字符串
所以我有一堆这样的解析器:
}
本质上,我想重用解析器id
和args
in blockLine
,而不是获取List()
s 和~
s 的嵌套树,我想取回匹配的原始字符串。这样做的目的是进行一些智能文本预处理(使用我稍后将用于实际解析的相同解析器)以在行中间插入一些文本。就像是:
预处理器的更高目的是通过并将缩进分隔的块转换为花括号分隔的块,以便稍后我可以通过普通解析器运行预处理文件。有什么简单的方法可以做到这一点?
scala - scala 组合器解析器没有像我想象的那样回溯……
我一直盯着自己的这个问题看,我想这可能是一个非常愚蠢的问题。但我必须吞下我的骄傲。
我有这个组合器解析器,它不会像我想象的那样回溯。我一直在将其简化为一个小例子,而没有完全删除上下文。感觉像“foobar”-示例更难阅读。我来啦:
那么第三次测试失败了:
所以似乎litre-parser
消耗了 l 然后它在找不到任何空间时失败了。但我原以为它会回溯并尝试下一个生产规则。显然implicitPieces
解析器会解析这一行,因为如果我删除前面的卷解析器(删除注释),它会成功
为什么不amount
回溯?我有什么误解?
sql - 区分逻辑运算符和其他中缀运算符
我正在尝试解析 SQL 搜索条件,但无法让解析器将逻辑 ( AND
, OR
) 与其他中缀运算符区分开来。我将它们解析为不同的节点(也许这很难做到),但简化了评估阶段。这是相关的代码片段(如有必要,我可以包含更多)。
"1 = 1"
正确解析为Comparison (Eq,Constant (Int32 1),Constant (Int32 1))
但是一旦我尝试使用逻辑运算符加入两个比较,例如"1 = 1 or 2 = 2"
,它无法解析
Ln 中的错误:1 Col:7
1 = 1 或 2 = 2
^
预期:输入结束或中缀运算符
:7
我希望它将1
错误之前的错误解析为标量表达式,并在or
回溯时意识到它不是中缀运算符,1
作为完整的标量返回,并识别它正在解析由逻辑运算符连接的条件的左侧or
。
相反,它似乎继续假设1
开始一个更复杂的标量表达式,可能涉及中缀运算符。
代码有问题,还是将AND
/解析OR
为中缀运算符的解决方案(使用相同的OperatorPrecedenceParser
)?我宁愿不走那条路,所以我希望我在某个地方犯了一个简单的错误。
完整的代码在要点上。
parsing - 在 Scala 中添加定位到 Lexical/StdLexical
我正在创建一个与 StdLexical 相似的 Lexer,并在行为方面进行了一些更改(但就我的问题而言,演示如何将其添加到 StdLexical 就可以了)。我正在尝试添加对记录令牌位置的支持,但遇到了问题。如果我只是尝试添加positioned
,我会得到并非完全意外的错误,这基本上表明我无法positioned
使用不输出位置的解析器运行。
所以:我如何限制我的词法分析器的输入,以便它可以有位置解析器,或者(如果这是一个错误的问题):将位置信息添加到 StdLexical 的最佳方法是什么?