问题标签 [fsyacc]

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

parsing - 使用 yacc 解析表达式序列

我正在尝试解析不带分隔符的表达式序列,以便能够解析 ML/F# 样式的函数调用:

但是,表达式序列给了我一个移位/减少冲突的列表。

我的猜测是冲突是由我的语法的递归性质引起的,但我不知道如何解决这些冲突。

我的(简化的)优先规则和语法如下所示:

当我将它传递给 fsyacc 时,我会得到一个 shift/reduce 和 reduce/reduce 冲突列表。一个示例移位/减少冲突是

状态 11 的 fsycc 的输出是:

自从我学习编译器理论课程以来已经有一段时间了,所以虽然我知道什么是移位/归约和归约/归约冲突,但我不习惯思考它们。特别是,我看不到减少如何PLUS导致有效的解析。总而言之,对以下一个或多个问题的任何见解都将受到高度赞赏:

  1. 为什么我的语法看起来模棱两可?
  2. 我可以使用优先级和/或关联性规则来修复它吗,或者,如果不是,
  3. 我是否需要重写语法,如果需要,大致上,我该怎么做?
  4. yacc 是适合这种构造的工具吗?
0 投票
3 回答
1506 浏览

msbuild - 在 Vs2013 中使用 FsLex/Yacc

我正在尝试恢复我在 vs 2008 中使用的旧 f# 解析器项目以使用 vs 2013。它使用 FsLexYacc。

我通过使用预构建步骤使其构建正常,如下所示:

但这并不理想,因为无论输入是否发生变化,它都会执行。

然后我尝试使用旧的 MsBuild 操作:

但这些似乎在构建过程中被完全忽略了。那正确吗?这些构建任务是否以某种方式被删除了?

然后我在 vs C++ 下发现了一些我认为可能有用的东西:

(我检查了 Microsoft.Fsharp.Targets 文件以提出“CoreCompile”目标。)

唉,还是没有雪茄。

是否有人能够阐明是否确实可以将 fslex/yacc 正确集成到 vs 2013 解决方案中,如果可以,如何?

0 投票
1 回答
2018 浏览

parsing - 区分 F# lex/yacc 解析器中的“减号”运算符和负数

我正在尝试使用 FsLex 和 FsYacc 解析一种简单的脚本语言,但在区分减号运算符和负数时遇到了问题。

如果我评估术语“1 - 2”,解析器将返回所需的 AST: Minus(NumberLiteral(1.0),NumberLiteral(2.0))。但是如果我评估术语“1-2”,词法分析器将产生数字 1,然后是数字 -2,这不是有效的输入。

我制作了一个最小的程序来重现我的问题。Ast 定义如下:

词法分析器代码如下所示:

解析器如下所示:

我最初的想法是不在-词法分析器中处理数字的一部分,并让解析器确定MINUS标记是否应该产生减号运算符或负数。不幸的是,这也会导致输入“- 2”被评估为负数,因为会消耗空格。

但我认为这一定是一个普遍的问题,并且必须存在一个共同的解决方案。那么我该如何最好地处理这个问题呢?

0 投票
1 回答
155 浏览

f# - FsLexYacc:测试/MiniProject“.fsproj 中的导入不正确”

github 上FsLexYacc项目有一个测试目录。我尝试设置最简单的一个(“LexAndYaccMiniProject”)。

我按照以下步骤操作:

1/ 创建一个名为“LexAndYaccMiniProject”的 F# 控制台应用程序

2/安装包(“ PM > Install-Package FsLexYacc”来自VS 2013社区,它运行成功但只在项目目录下的包目录中创建文件)

3/ 关闭解决方案

4/ 将所有文件(Lexer.fsl、Parser.fsy、Program.fs、LexAndYaccMiniProject.fsproj、App.config)从 github 复制到本地项目目录

5/打开解决方案 --> 错误消息说没有这样的“bin\Debug\FsLexYacc.targets”文件。

从 FsLexYacc主页安装说明,我得到一个 .fsproj 的链接,其中包含:

它与另一个项目(TestProjectUsingNugetPackage)有关,该链接不同于上面“示例”部分中的链接,指的是我已经复制的项目(“ LexAndYaccMiniProject ”)。

显然,FsLexYacc 主页安装说明部分通过链接指向最近托管在 github 上的两个不同项目。

问题:我缺少哪些步骤?接下来我应该检查什么?

0 投票
1 回答
103 浏览

f# - 在 FSYACC 中使用记录类型

在 FSYACC 中,通常会有导致元组的终端。但是,为方便起见,我想改用记录类型。例如,如果我的抽象语法树 (AbstractSyntaxTree.fsl) 中有以下内容:

我不清楚 FSYACC (parser.fsy) 中的正确语法,因为如果我使用:

我希望推断出类型 B 和元组。但是,FSYACC 对标有“!!!”的两行都给出了错误:

最后两行的“任一”生产的正确语法是什么?

0 投票
0 回答
247 浏览

visual-studio - 使用带有 FsLex 和 FsYacc 的 Visual Studio 2013 在 F# 中创建功能解析器

我已经苦苦挣扎了一段时间,只是让解析器在 F# Visual Studio 2013 中编译和工作。我已经阅读了很多其他看起来很有帮助的帖子,包括堆栈溢出和此页面:https://en.wikibooks .org/wiki/F_Sharp_Programming/Lexing_and_Parsing但没有任何效果。我知道如何编写解析器以及我无法正确编译的所有内容,并且在 Visual Studio 2013 中创建 .fsl 和 .fsp 文件似乎不是很直观。此链接:https ://github.com/fsprojects/FsLexYacc/tree/master/tests/LexAndYaccMiniProject很有帮助,但缺少 Lexer.fs、Parser.fs 和 Parser.fsi。对此的任何帮助将不胜感激。我一直在使用可以安装在包管理器上的 FsLexYacc 包。提前致谢。

编辑:试图通过添加更多信息来改进问题。
1)在 Visual Studio 中,我创建了一个新的控制台项目并导入了 FsLexYacc 包
2)我制作了一个 .fs 文件,其中包含类型定义等,就像上面发布的链接中的示例一样
3)这是我遇到麻烦的地方。我知道在 .fsp 和 .fsl 文件中放入什么,但我不知道如何在 Visual Studio 中创建它们并使用 FsLex 和 FsYacc 工具正确编译它们。上面的 github 链接详细介绍了有关编辑 .fsproj 文件的信息,但我尝试过的任何方法都没有奏效。我假设为了获得创建 .fsp 和 .fsl 文件的工具,这些工具会从普通的 .fs 文件中创建它们,但我不确定,也不知道具体该怎么做,所以澄清会很棒。

要重现我的问题,请按照 wiki 页面上的步骤或将文件从 github 链接复制到新项目,无论如何我都无法编译。

这个问题与我的类似,但我也无法按照以下答案工作:Using FsLex/Yacc in Vs2013

0 投票
0 回答
655 浏览

parsing - 在 F# 中创建简单的解析器

我目前正在尝试使用 FsLex 和 FsYacc 在 F# 中创建一个非常简单的解析器。起初,我试图实现的唯一功能是允许程序接收一个表示整数相加的字符串并输出结果。例如,我希望解析器能够接收“5 + 2”并输出字符串“7”。我只对字符串参数和输出感兴趣,因为一旦我扩展功能以支持更多操作,我想使用 Excel DNA 将解析器导入 Excel。但是,我目前正在努力让这个简单的整数加法正常工作。

我的 lexer.fsl 文件如下所示:

我的 parser.fsy 文件如下所示:

此外,我有一个 Program.fs 文件,它的作用类似于(非常小的)AST:

最后,我有文件 Main.fs 应该测试解释器的功能(以及将函数导入 Excel)。

但是,当我运行此函数时,解析器根本不起作用。当我构建项目时,会正确创建 parser.fs 和 lexer.fs 文件。我觉得我缺少一些简单的东西,但我不知道如何正确地制作这个功能。

0 投票
1 回答
436 浏览

f# - FsLex FsYacc:如何创建具有多行注释的语言

我正在玩基于 ocamllex 和 ocamlyacc 的 FsLex 和 FsYacc。用语言定义评论的最佳方式是什么?我是否在我的 lex 文件中创建注释标记?在语法的上下文中,我无法理解的评论有一些复杂性:

  1. 注释可以放在语法中的任何地方,应该被忽略。
  2. 注释可以包含任何内容,包括其他标记和无效代码。
  3. 注释可以跨越多行,我需要维护调试器的源代码位置。在 FsLex 和 ocamllex 中,这必须由语言开发人员完成。
0 投票
1 回答
177 浏览

f# - FsLex 中止并在“{”上出现解析错误

我的 Lexer 应该在词法分析期间区分括号并维护一堆打开的括号。为此,我在我的 fsl 文件中指定了一个辅助函数,如下所示:

堆栈当然是 char 列表的引用。并相应地实现了 push、top、pop。

{问题是在我添加角色之前一切正常。现在 FsLex 只是随着error: parse error

如果我将字符更改为字符串,即"{"再次写入 FsLex 就可以了,因此解决方法是将实现更改为字符串堆栈而不是字符。

然而,我的问题是,这种行为从何而来?如果 FsLex,这是一个错误吗?

0 投票
0 回答
173 浏览

f# - 如何为 F# 中的解释器开发设置 Visual Studio/JetBrains Rider?

一段时间以来,我在配置 IDE(Visual Studio 和 JetBrains Rider)以包含 FsLexYacc 包等以开始学习解释器开发时遇到问题。我一直在 GitHub 上关注如何将配置添加到 .fsproj 文件中的本指南,但是我的 VS 2017 因无法识别标签 FsYacc 的问题而崩溃。我也一直在寻找在线模板,没有可用的。也许你们中的一些人遇到了同样的问题并找到了解决方案并可以帮助我?

编辑:当我更新 .fsproj 文件时 IDE 抛出的错误: