问题标签 [fparsec]

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

parsing - 使用 OperatorPrecedenceParser 使用 FParsec 解析函数应用程序?

这个问题与这个问题类似,但我想使用 in 解析一个带有函数应用程序的OperatorPrecedenceParser表达式FParsec

这是我的 AST:

我有以下输入:

这是解析器代码:

我的问题是函数参数也是表达式(它们可以包括运算符、变量等),我不知道如何扩展我的expr解析器以将参数列表解析为表达式列表。我在这里构建了一个解析器,但我不知道如何将它与我现有的解析器结合起来:

我的解析器目前有以下输出:

我想要的是得到以下内容:

0 投票
3 回答
964 浏览

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)?我宁愿不走那条路,所以我希望我在某个地方犯了一个简单的错误。

完整的代码在要点上。

0 投票
2 回答
188 浏览

f# - 使用 OperatorPrecedenceParser 解析不区分大小写的运算符

是否可以使用不区分大小写的方式解析非符号运算符(例如 , AND)?OROperatorPrecedenceParser

0 投票
1 回答
151 浏览

parsing - 如何使标识符解析器停止在 FParsec 中 OperationPrecedenceParser 的运算符上?

我正在为将使用 unicode 符号的标识符名称实现解析器。我面临的问题是我有一些也用 unicode 符号编写的运算符,这些运算符可能直接放在标识符之后,例如:

这里的箭头符号是一个中缀运算符,我将它添加到我的运算符优先级解析器中:

如果我可以自动排除作为运算符添加到 OPP 的所有符号组合,那就太好了。目前,我使用以下实现为我的标识符手动执行此操作:

但是,这似乎不起作用。我在尝试解析我的代码时收到以下错误消息:

如何让我的variable解析器停止在中缀运算符上?

0 投票
1 回答
205 浏览

parsing - 在 FParsec 中使用带有标识符解析器的预处理函数?

我正在使用identifierFParsec 的解析器来解析变量和函数的名称,它们通常是 Unicode 和 ASCII 字符的混合。但有时我在开头(如\u03C0)或标识符(如swipe_board\u003A_b)中转义了 Unicode 字符。我仍然可以使用isAsciiIdStartisAsciiIdContinue选项使它们可解析,但我无法在规范化之前定义自己的自定义函数进行预处理。这里有什么解决方案?

0 投票
1 回答
748 浏览

f# - 解析带括号的表达式

对于 SQL 搜索条件,我有以下 fsycc 语法(稍作修改的形式):

我已经在 FParsec 中重新实现了它(在上一个问题的帮助下)。以下是相关位:

这会解析1 = 1 or 2 = 2,但在括号中包装一个常量或整个搜索条件会导致它失败(奇怪的是,在括号中包装比较有效)。这是一个失败的例子:

标量、比较和搜索条件可能都以类似的方式开始(开括号 -> 常量 -> 中缀运算符),但本质上是根据最终遇到的运算符类型来区分的。例如,如果您点击,or您就知道左括号属于整个条件,而不是左侧的比较。这是否通过回溯正确处理?如果是这样,您将如何以不消耗任何输入的方式在解析复杂表达式时失败?

处理标量、比较和搜索条件的可选括号由 fsyacc 语法中的左递归处理。我知道这需要在 FParsec 中考虑。但是从上述错误中,我无法想象如何摆脱广泛的回溯。

0 投票
1 回答
510 浏览

.net - 使用 FParsec 进行基本错误恢复

假设我有这个解析器:

现在,"2+3;2*4;3*4;3+3;"将失败并出现错误2*4;2*4;但是,如果我想要 和 的错误,最佳实践是什么3+3;?基本上,我想扫描到最近的';' 但前提是存在致命错误。如果发生这种情况,我想汇总错误。

亲切的问候, Lasse Espeholt

更新: recoverWith是一个很好的解决方案,谢谢!但鉴于:

我希望[]没有错误。或者更“公平”一点:

0 投票
1 回答
402 浏览

.net - FParsec 中的尾递归

我遇到了解析器有两个递归分支的问题。为了更容易地演示这个问题,我使用Luca Bolognese 撰写的文章中的 lambda 演算的简单语法作为示例:

文章中的解析器相当简洁:

我很感兴趣,pApplication因为它们由两个pExprs 组成,而这两个 s 也可能是pApplications。解析器在以下基准测试中耗尽了堆栈空间:

如何将解析器重写为尾递归?

当我尝试为类似 Lisp 的语言编写解析器并使用真实的基准测试它时,我意识到了这个问题。我有TermVarBinding它们是相互递归的类型和一个let解析器,它表现出与上述相同的问题pApplication。我的解析器在 github 上,以防关于非尾递归问题的分析错误。

0 投票
2 回答
995 浏览

f# - FParsec 标识符与关键字

对于具有关键字的语言,需要发生一些特殊的技巧来防止例如“if”被解释为标识符,以及“ifSomeVariableName”在令牌流中成为关键字“if”后跟标识符“SomeVariableName”。

对于递归下降和 Lex/Yacc,我只是采用了在词法分析器和解析器之间转换令牌流的方法(根据有用的指令)。

但是,FParsec 似乎并没有真正做一个单独的词法分析器步骤,所以我想知道处理这个问题的最佳方法是什么。说到这里,Haskell 的 Parsec 似乎支持词法分析器层,但 FParsec 不支持?

0 投票
1 回答
386 浏览

f# - FParsec 反应式示例

我希望有人可能会发布一个使用 FParsec 的示例,其中数据基于某种传入的实时流。

一些示例可能是基于鼠标手势生成结果,基于特定的股票报价序列生成警报或通知。

如果有人可以发布一个示例,将不胜感激。

谢谢!