问题标签 [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.
parsing - 使用 OperatorPrecedenceParser 使用 FParsec 解析函数应用程序?
这个问题与这个问题类似,但我想使用 in 解析一个带有函数应用程序的OperatorPrecedenceParser
表达式FParsec
。
这是我的 AST:
我有以下输入:
这是解析器代码:
我的问题是函数参数也是表达式(它们可以包括运算符、变量等),我不知道如何扩展我的expr
解析器以将参数列表解析为表达式列表。我在这里构建了一个解析器,但我不知道如何将它与我现有的解析器结合起来:
我的解析器目前有以下输出:
我想要的是得到以下内容:
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
)?我宁愿不走那条路,所以我希望我在某个地方犯了一个简单的错误。
完整的代码在要点上。
f# - 使用 OperatorPrecedenceParser 解析不区分大小写的运算符
是否可以使用不区分大小写的方式解析非符号运算符(例如 , AND
)?OR
OperatorPrecedenceParser
parsing - 如何使标识符解析器停止在 FParsec 中 OperationPrecedenceParser 的运算符上?
我正在为将使用 unicode 符号的标识符名称实现解析器。我面临的问题是我有一些也用 unicode 符号编写的运算符,这些运算符可能直接放在标识符之后,例如:
这里的箭头符号是一个中缀运算符,我将它添加到我的运算符优先级解析器中:
如果我可以自动排除作为运算符添加到 OPP 的所有符号组合,那就太好了。目前,我使用以下实现为我的标识符手动执行此操作:
但是,这似乎不起作用。我在尝试解析我的代码时收到以下错误消息:
如何让我的variable
解析器停止在中缀运算符上?
parsing - 在 FParsec 中使用带有标识符解析器的预处理函数?
我正在使用identifier
FParsec 的解析器来解析变量和函数的名称,它们通常是 Unicode 和 ASCII 字符的混合。但有时我在开头(如\u03C0
)或标识符(如swipe_board\u003A_b
)中转义了 Unicode 字符。我仍然可以使用isAsciiIdStart
和isAsciiIdContinue
选项使它们可解析,但我无法在规范化之前定义自己的自定义函数进行预处理。这里有什么解决方案?
f# - 解析带括号的表达式
对于 SQL 搜索条件,我有以下 fsycc 语法(稍作修改的形式):
我已经在 FParsec 中重新实现了它(在上一个问题的帮助下)。以下是相关位:
这会解析1 = 1 or 2 = 2
,但在括号中包装一个常量或整个搜索条件会导致它失败(奇怪的是,在括号中包装比较有效)。这是一个失败的例子:
标量、比较和搜索条件可能都以类似的方式开始(开括号 -> 常量 -> 中缀运算符),但本质上是根据最终遇到的运算符类型来区分的。例如,如果您点击,or
您就知道左括号属于整个条件,而不是左侧的比较。这是否通过回溯正确处理?如果是这样,您将如何以不消耗任何输入的方式在解析复杂表达式时失败?
处理标量、比较和搜索条件的可选括号由 fsyacc 语法中的左递归处理。我知道这需要在 FParsec 中考虑。但是从上述错误中,我无法想象如何摆脱广泛的回溯。
.net - 使用 FParsec 进行基本错误恢复
假设我有这个解析器:
现在,"2+3;2*4;3*4;3+3;"
将失败并出现错误2*4;
。2*4;
但是,如果我想要 和 的错误,最佳实践是什么3+3;
?基本上,我想扫描到最近的';' 但前提是存在致命错误。如果发生这种情况,我想汇总错误。
亲切的问候, Lasse Espeholt
更新: recoverWith
是一个很好的解决方案,谢谢!但鉴于:
我希望[]
没有错误。或者更“公平”一点:
.net - FParsec 中的尾递归
我遇到了解析器有两个递归分支的问题。为了更容易地演示这个问题,我使用Luca Bolognese 撰写的文章中的 lambda 演算的简单语法作为示例:
文章中的解析器相当简洁:
我很感兴趣,pApplication
因为它们由两个pExpr
s 组成,而这两个 s 也可能是pApplication
s。解析器在以下基准测试中耗尽了堆栈空间:
如何将解析器重写为尾递归?
当我尝试为类似 Lisp 的语言编写解析器并使用真实的基准测试它时,我意识到了这个问题。我有Term
,VarBinding
它们是相互递归的类型和一个let
解析器,它表现出与上述相同的问题pApplication
。我的解析器在 github 上,以防关于非尾递归问题的分析错误。
f# - FParsec 标识符与关键字
对于具有关键字的语言,需要发生一些特殊的技巧来防止例如“if”被解释为标识符,以及“ifSomeVariableName”在令牌流中成为关键字“if”后跟标识符“SomeVariableName”。
对于递归下降和 Lex/Yacc,我只是采用了在词法分析器和解析器之间转换令牌流的方法(根据有用的指令)。
但是,FParsec 似乎并没有真正做一个单独的词法分析器步骤,所以我想知道处理这个问题的最佳方法是什么。说到这里,Haskell 的 Parsec 似乎支持词法分析器层,但 FParsec 不支持?
f# - FParsec 反应式示例
我希望有人可能会发布一个使用 FParsec 的示例,其中数据基于某种传入的实时流。
一些示例可能是基于鼠标手势生成结果,基于特定的股票报价序列生成警报或通知。
如果有人可以发布一个示例,将不胜感激。
谢谢!