问题标签 [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 投票
3 回答
296 浏览

f# - 解析成复杂类型

我对 F# 和 FParsec 还很陌生,我什至不想通过展示我到目前为止所拥有的东西来让自己难堪。

在 FParsec 示例中,AST 中的每种类型(我看到的)都是单个值、列表或元组的类型缩写。

如果我有一个复杂的类型,它应该包含一个解析过的函数名和它的参数怎么办?

因此,f(a, b, c)将被解析为PFunction具有字符串成员NamePParameter列表成员的类型的对象Parameters。我怎样才能从一个可以匹配的解析器f(a, b, c)变成|>>一个PFunction

到目前为止,我似乎能做的就是创建复合解析器,但不把它变成任何东西。如果 Calculator 示例包含类似 Term 的类型的 AST,但在我看来,它似乎是解释器而不是解析器,因此没有 AST。此外,术语可能只是其他类型缩写组件的元组。

谢谢!

0 投票
1 回答
614 浏览

f# - 使用 FParsec 解析可选的多行表达式

我正在为这种形式的字符串编写 FParsec 解析器:

换句话说,这是一个带有可选时间量词的“do”语句,或者是一个单独的“action”语句或一个“action”列表(每个都在一个新行上),最后有一个“end do”(我为简单起见省略了缩进/尾随空格处理)。

这些是有效输入的示例:

这看起来不是很复杂,但是:

为什么这不起作用?

这个表达式的正确解析器是什么?

0 投票
0 回答
97 浏览

bnf - FParsec 中的同时匹配

如果我试图将以下内容解析为linesand fields。行由 分隔'\n',字段由 分隔'|'

我可以定义以下内容:

let fields = sepBy (manyChars (escapedDC <|> displayCharacter)) (pchar '|')无法将 排除在外'|'。这些分隔符是上下文相关的,因此我想避免将它们硬编码为显示字符,displayCharacter'|'在某些上下文中可能需要转义。

如果我尝试定义一个fieldwith manyCharsTill,那么我需要考虑一行中的最后一个元素 with anyOf "|\n",但这会将所有行读入一个line.

'|'除了在某些情况下支持的之外,我可能还有更多的子分隔符。出于这个原因,必须为每种情况定义 displayCharacter 和 escapedDC 的版本似乎很麻烦。相反,使用前瞻功能似乎更干净。或者也许是一个被调用的解析器both,它以某种方式需要同时在两个解析器上进行匹配。

或者

有没有更简单的方法来实现这一点?也许只是我隐含的 BNF 有缺陷——如果修复了,会很容易翻译吗?

=============

这是我能想到的最好的方法,但我想从专家那里知道这是否是最灵活的方法。

0 投票
1 回答
635 浏览

parsing - 如何解决 FParsec 错误“组合子 'many' 已应用于成功但不消耗...的解析器”

我有一个看起来很简单的解析器。我将此子解析器添加到末尾以提供有关一般解析错误的信息,因为所有其他子解析器都失败了 -

但是,一旦我将 readError 添加为选项,我就会在运行时收到关于流消耗的可怕 FParsec 错误 -The combinator 'many' was applied to a parser that succeeds without consuming input and without changing the parser state in any other way.我不明白为什么我会得到这个,因为我确实使用解析后的行的其余部分来创建一个使用过的错误(这里'违规')结构。

有人可以帮我理解这一点吗?我是否会以错误的方式向用户发送解析器错误信号?如果没有,我该如何解决这个问题?

感谢您的帮助!

* 更多详情 *

这里还有一些可能相关的代码 -

我不知道。也许问题在于,一旦它尝试运行 readError 解析器,它就已经在流的末尾了。这会使 restOfLine 不消耗任何输入,甚至不消耗空格吗?

* 结论 *

事实证明,使用 readError 解析器报告错误的方法是错误的。正确的方法是像这样使用“直到结束”解析器 -

现在,当我需要获取输入流中的所有表达式时,我只需运行 readExprsTillEnd。

再次感谢古斯塔沃!

0 投票
0 回答
614 浏览

parsing - 如何处理 FParsec 中的左递归

我的语言使用带有一个附加功能的 s 表达式 - 用于访问数组或结构中的元素的点运算符。

目前,我的解析器使用access运算符处理此代码 -

但是,我想使用像这样的点运算符添加备用解析 -

它们都将解析为等效的 AST。左递归在这里很重要,因为像这样的表达式(f x).y应该像这样解析出来(access :m:y (f x))

但是,我不知道如何让 FParsec 处理这种类型的左递归解析,或者我有什么替代左递归的方法。

0 投票
1 回答
622 浏览

parsing - 使用 FParsec 进行分块解析

是否可以像从套接字一样以块的形式向 FParsec 解析器提交输入?如果没有,是否可以检索输入流的当前结果和未解析部分,以便我可以完成此操作?我正在尝试运行来自SocketAsyncEventArgs不缓冲整个消息的输入块。

更新

注意使用 的原因SocketAsyncEventArgs是表示向 a 发送数据CharStream可能会导致对底层的异步访问Stream。具体来说,我正在考虑使用循环缓冲区来推送来自套接字的数据。我记得 FParsec 文档指出Stream不应异步访问底层,因此我计划手动控制分块解析。

终极问题:

  1. 我可以在Stream传递给的下使用循环缓冲区CharStream吗?
  2. 在这种情况下,我不需要担心手动控制分块吗?
0 投票
2 回答
743 浏览

f# - Can someone give an example of using chainl1 in FParsec?

This is the most puzzling combinator in all of FParsec...

http://www.quanttec.com/fparsec/reference/primitives.html#members.chainl1

...but there is no example on how to use it in the documentation or, AFAIK, on any web pages on the internet. I have a left-recursive parse that seems to require it, but for the life of me I can't figure out how to call it or what to pass to it.

Please help :)

0 投票
2 回答
2293 浏览

parsing - FParsec 中的示例语法超越了示例?

我正在寻找一些用 FParsec 编写的示例语法,这些语法将超出项目存储库中的示例。

我发现了这个非常好的GLSL 语法,但这是我找到的唯一示例。我需要的是一种类似于 C 或 JavaScript 的语言的语法。

0 投票
1 回答
1552 浏览

f# - 在 FParsec 中解析数字

我已经开始学习 FParsec。它有一种非常灵活的数字解析方式;我可以提供一组我想使用的数字格式:

但是,我试图解析的语言有点奇怪。数字可以是数字(非负int)、十进制(非负float)、十六进制(带前缀#x)或二进制(带前缀#b):

现在我必须通过替换(如有必要)来进行两次解析#0使用pnumber

在这种情况下,有什么更好的解析方法?或者我怎样才能改变 FParsecCharStream以使条件解析更容易?

0 投票
1 回答
1250 浏览

parsing - 用 FParsec 解析字符串文字?

我想使用 FParsec 解析字符串文字。通过“字符串文字”,我的意思是开始和结束引号之间的东西(在我的例子中 - 单引号):

我目前正在做的事情如下:

但这在第一个字母被消耗后停止。有没有办法让它变得贪婪?