问题标签 [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.
f# - FParsec 和基于分隔符的语法
我正在尝试使用 fparsec 来解析一个简单的待办事项列表语言(实际上是来自 TaskPaper 的数据)作为一个简单的解析器组合器示例。但是我遇到了一个我似乎无法解开的错误。我是解析器组合器的新手,FParsec 似乎依赖于我了解 Parsec,但我发现 parsec 文档难以理解。
任务论文语言的规则很简单(我现在忽略@tags)
- 项目以“:”结尾
- 任务以“-”开头
- 任何其他文本行都是项目或任务上的纯文本注释
所以字符串 "Project 1:\nSome note\nProject 2:" 应该从 parseFile 作为 [ProjectName("Project 1");NoteText("Some note");ProjectName("Project 2")] 返回,但相反,我get [ProjectName("Project 1");ProjectName("Some note\nProject 2")]
下面是我的解析器代码。
已编辑
语法取自 Hogbay Software 的 TaskPaper 应用程序TaskPaper 网站 一些语法示例
f# - 如何从 F# 列表中提取数据
继我之前的问题之后,我正在慢慢掌握 FParsec 的窍门(尽管我确实发现它特别难以理解)。
我的下一个 F# 新手问题是,如何从解析器创建的列表中提取数据?
例如,我将上一个问题中的示例代码加载到一个名为 Parser.fs 的模块中,并在一个单独的模块中添加了一个非常简单的单元测试(带有适当的引用)。我正在使用 XUnit:
交互地,当我执行解析“1”时,响应是:
通过调整有效运算符列表,我可以运行parse "1+1"来获得:
我需要什么来代替我的???在上面的片段中?以及如何检查它是数字,而不是运算符等?
f# - FParsec:如何在 fparsec 中解析日期(新手)
我正在使用关于如何使用 fparsec 解析分隔文件的Bill Casarin帖子,我正在简化逻辑以了解代码的工作原理。我正在将多行分隔的文档解析为单元格列表结构(目前),其中单元格是字符串或浮点数。我是这方面的新手。
我在解析浮点数时遇到问题 - 在典型情况下(由制表符分隔的单元格,包含数字)它可以工作。然而,当一个单元格恰好是一个以数字开头的字符串时 - 它就会分崩离析。
如何修改 pFloatCell 以将(尽管通过选项卡)解析为浮点数或什么都不解析?
谢谢
哎呀昨晚我迟到了。我的意思是发布数据。这第一个有效
虽然这会返回一个错误:
返回,无论是否有 ChaosP 的推荐:
ErrorMsg = "Ln 中的错误:1 Col: 3\r\n2011 年 3 月 10 日 18:28:11 GMT\r\n ^\r\n预期:文件结尾、换行符或 '\t'\r\n"
看起来尝试工作正常。在第二种情况下,它只抓取到 10 - 并且pfloat 的代码只查找到第一个空格。我需要说服 pfloat 它需要一直查找到下一个选项卡或换行符,无论它之前是否有空格;通过执行 Double.Parse 编写我自己的 pfloat 版本 - 但我宁愿依赖库。
parsing - FParsec 中的递归文法
我决定检查 FParsec,并尝试为 λ 表达式编写解析器。事实证明,渴望使递归解析变得困难。我该如何解决这个问题?
代码:
谢谢!
f# - 解析 if / else / if 语句
我正在尝试复制一个简单 if 语句的结构:
对于 if (paren) 块,我创建了一个 IfBlock AST 节点。否则,它会递归地填充 IfElseBlock 节点。
我尝试了很多替代结构
建议?
f# - fparsec 中的位置信息
我的 AST 模型需要携带位置信息(文件名、行、索引)。是否有任何内置方法可以访问此信息?从参考文档中,流似乎带有位置,但我希望我不必为了保存位置而实现虚拟解析器,并在任何地方添加它。
提前致谢
recursion - 如何在 F# 中表达一个可以选择性地递归自身的类型(无限地)
作为学习练习,我正在尝试使用功能解析器库 fparsec ( FParsec ) 为 graphviz 点语言 ( The DOT language ) 实现解析器。该语言描述图形。
查看语言定义,我不得不写下以下定义:
wherepstmt
和pchar ';'
是解析器,.>>
将>>.
左解析器的出现与右解析器的出现组合opt
,并将其参数解析器的可选出现解析为选项值。然而,这个定义并不能抱怨“......结果类型将是无限的......”。
通过查看上面链接的 DOT 语言,这个示例可能最容易理解。
我知道以下看似相关的问题:
但是我的 F# 知识可能还不足以翻译它们,如果它们在这里适用的话。
f# - 在 FParsec 中解析简单类型
我正在尝试使用 FParsec 解析标准的简单类型(在 lambda 演算的意义上),但是我很难从 Lex/Yacc 样式转换为 FParsec 中使用的样式,特别是在递归定义方面。
我试图解析的类型示例是:
- ○
- o->o
- (o -> o -> o) -> o
这是我的尝试:
当我将其加载到交互式时,最后一行会导致堆栈溢出(具有讽刺意味的是,这些天很难搜索)。鉴于存在递归引用,我可以想象为什么,但我会认为一个标记前瞻会阻止遵循stype
. 因此,我假设它必须是选择arr
,选择stype
,等等。但是如何防止这种循环呢?
我对有关该库的惯用用法的评论以及对我尝试的解决方案的更正感兴趣。
f# - 选择 fsycc/fslex 或 FParsec 什么?
我需要解析简单的 DSL 语言,如下所示:
解析这种语言最合适的工具是什么?
.net - 尝试在 F# Interactive 中运行 FParsec 时出现问题
我正在尝试在 F# Interactive 中运行一些FParsec代码,但没有成功。我能够构建和运行这个tutorial.fs
文件,但 FSI 并没有发生同样的情况,因为它无法识别FParsec.dll
.
我已经尝试#r "Parsec"
在 FSI 中运行该命令,但无济于事。
任何人都知道这里可能存在什么问题?