问题标签 [fslex]

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 投票
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 投票
0 回答
149 浏览

f# - FsLexYacc 空格缩进

我正在尝试使用 FsLexYacc 实现类似 Python 的空白缩进(读作:在需要时发出缩进/缩进标记)。

似乎 FsLexYacc 无法使用unputC/C++ 示例用于对基于空格的缩进进行词法分析。我尝试在词法分析期间使用一个附加参数作为“缩进堆栈”,但每个 lex 规则无法返回一个以上的标记,因此无法在文件末尾返回所有待处理的 dedent 或在需要时返回多个 dedent。

有没有一种方法可以在 FsLexYacc 中实现基于空格的缩进,而无需首先标记完整的字符串并在所有标记上应用单独的传递以在适当的情况下用缩进/缩进替换空格?(即使这种可能的解决方案似乎也很难使用(LexBuffer<char> -> token)签名,以便能够将其传递给生成的解析器)

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 抛出的错误:

0 投票
0 回答
64 浏览

f# - 我参考库(来自 Nuget)的预构建事件命令不编译程序

我学习 F# 已经有一段时间了,我想尝试创建一个小型 SQL 解析器。我找到了一个教程,它解释了如何通过 FsLex 和 FsYacc 执行此操作,但是,该站点没有提供任何下载链接。在 Visual Studio 下,通过 nuget,我遇到了这个,然后我下载了它。它似乎与网站提供的解释非常相似,所以我认为这与问题无关。

我离它不远了,这是我的两个小文件:

Sql.fs:

SqlParser.fsp:

这是我的项目的文件/参考列表:

这是预构建命令,它应该与“SqlParser.fsp”文件交互:

当我使用这个命令编译时,Visual Studio 告诉我“生成失败”,但没有错误,这些列表是空的。当我删除此命令时,项目“正常”编译,实际上文件“SqlParser.fsp”应该生成其他文件(因此是 prebuild 命令)。

  • 我错过了什么吗?
  • FsLexYacc 库是否已过时?
  • 教程不对吗?
  • ...

先感谢您。

0 投票
1 回答
43 浏览

f# - LexBuffer 类型中的“arg00”是什么.LexemeString?

Fsharp.Text.Lexing's类型中的“arg00”是LexBuffer<char>.LexemeString什么?

0 投票
1 回答
245 浏览

.net - 在命令行下,如何编译一个 F# lexer 然后在 Mac OS 上运行?

我没有在命令行上找到用于编译 F# 源代码然后在 Mac OS 上运行它的文档。这是我尝试过的,但没有奏效。

首先,我有一个词法分析器规范文件“ExprLex_hj.fsl”。我使用从网站获取的奇怪命令行生成了词法分析器:

上面的行生成了一个名为“ExprLex_hj.fs”的文件。然后我用从另一个网站复制的另一个奇怪的命令行编译了那个 f# 文件

上面的这一行在我的 Mac OS 上生成了一个 EXE 文件,ExprLex_hj.exe. 现在我需要运行这个 EXE 文件。我听说我们可以使用 mono,这是 Microsoft 的 .NET Framework 的开源实现。所以,我尝试了

繁荣!我收到一个错误:

未处理的异常:System.BadImageFormatException:无法解析字段令牌 0x04000008,原因是:无法加载字段类型“<StartupCode$ExprLex_hj>.$ExprLex:_fslex_tables@24”(2),原因是:无法加载文件或程序集“ FsLexYacc.Runtime、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null' 或其依赖项之一。程序集:/Users/zell/test_lexer_fsharp/ExprLex_hj.exe 类型:$ExprLex 成员:(空)

你能告诉我如何解决这个问题吗?问题是关于如何运行从 F# 源文件生成的可执行文件的文档很少。大多数教程建议使用 .FSX 或在 REPL 上运行 af# 文件,这不是我想要的——我想从命令行执行生成的二进制文件。

此外,在我的机器上,我安装了 Visual Studio,但我仍然需要知道执行 EXE 的命令行方式。此外,在安装 Visual Studio 后,我的 PATH 中出现了“fshapri”、“fsharpc”、“mono”和“dotnet”。我实际上不确定在这种情况下是否应该使用“mono”或“dotnet”来运行 EXE。

0 投票
1 回答
73 浏览

f# - 为什么在词法分析器规范中对换行符和空格的处理不同?

我正在使用 F# 的 FsLex 来生成词法分析器。我很难从教科书中理解以下两行。为什么换行符 (\n) 的处理方式与空格不同?特别是,“lexbuf.EndPos <- lexbuf.EndPos.NextLine”与“Tokenize lexbuf”有何不同?