在命令行下,如何编译一个 F# 词法分析器然后 运行 它在 Mac OS 上?

Under the command line, how to compile a F# lexer and then run it on a Mac OS?

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

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

 mono ~/.nuget/packages/fslexyacc/10.0.0/build/fslex/net46/fslex.exe --unicode ExprLex_hj.fsl

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

fsharpc -r ~/.nuget/packages/fslexyacc/10.0.0/build/fsyacc/net46/FsLexYacc.Runtime.dll ExprLex_hj.fs

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

mono ExprLex_hj.exe

轰!我收到一个错误:

Unhandled Exception: System.BadImageFormatException: Could not resolve field token 0x04000008, due to: Could not load type of field '<StartupCode$ExprLex_hj>.$ExprLex:_fslex_tables@24' (2) due to: Could not load file or assembly 'FsLexYacc.Runtime, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. assembly:/Users/zell/test_lexer_fsharp/ExprLex_hj.exe type:$ExprLex member:(null)

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

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

Mono 正在走向灭绝。它正在被 .NET 5(.NET 核心 3.x 和 .NET 框架 4.7x 的继任者)取代。同时,在您的特定场景中,您应该使用 .NET 核心,因为这会导致更少的问题。您正在关注的教程或链接一定很旧。

使用 .NET 核心构建的是 dll 而不是 exe,即使它是可执行文件。对 运行 他们你做 dotnet myFile.dll。无论您处于 Windows、Linux 还是 Mac.

,这都有效

要构建 .NET 核心应用程序,请使用 dotnet build。但是既然你有 Visual Studio for Mac 就可以为你做到这一点;只需确保使用 F# 创建一个 .NET 核心项目。

您将需要使用 .net core 3.x 版本的 fslxyacc 而不是 .Net framework 4.6。任何针对 .Net framework 4.6 的内容都是为 Windows 设计的。 Mono 可能能够 运行 它但支持不完整。那么,如果 .NET 核心 运行 本身就在 Mac.

中,为什么要复杂化呢?

要获取此 dll,您可以从 https://github.com/fsprojects/FsLexYacc.git 构建它。或者使用 nuget。使用 nuget 在 VS 中为 Mac(.NET 核心控制台 F#)在 Nuget 包中创建一个空白的新项目添加 Fslexyacc。

fslex 的二进制文件(在 Mac 中)将放置在 ~/.nuget/packages/fslexyacc/10.0.0/build/fslex/netcoreapp3.0/.

从那里你应该能够构建你的词法分析器:

dotnet fslex.dll --unicode ExprLex_hj.fsl

ExprLex_hj.fs添加到您的项目中,构建。 FsLexYacc.Runtime.dll 应该在您添加 nuget 包时作为参考添加。那应该可以。