2

我正在尝试在我的 Mac 上为 Mono C# 编译器设置构建环境。目的是扩展研究项目的语法。我一直在努力建立构建。我确信答案很简单,但到目前为止我还找不到任何有用的信息。

我希望在 MonoDevelop 中有一个解决方案,语法是其中的一部分,并且在项目编译时会考虑对语法的任何更改。

到目前为止,我找到的解决方案文件包括一个 cs-parser.cs 文件,该文件在我从项目页面获得的源文件中不存在。我猜这个文件是在 cs-parser.jay 上运行解析器生成器的结果,但我找不到有关如何将其设置为构建步骤的信息(或者就此而言手动运行解析器生成器)

链接到如何使用 mcs 的演练教程将不胜感激或简单的一步一步

4

1 回答 1

1

README.makefiles

如果您的程序有“构建源”,即从其他文件生成的源文件(例如,由 jay 生成),请定义一个名为 BUILT_SOURCES 的变量,并且不要$(PROGRAM).sources 中列出源:

========================================
PROGRAM = myprogram.exe
LOCAL_MCS_FLAGS = /r:System.Xml.dll
BUILT_SOURCES = parser.cs
CLEAN_FILES = y.output

include ../build/executable.make

parser.cs: parser.jay
        $(topdir)/jay/jay $< > $@
========================================

executable.make 将自动删除“make clean”上的 $(BUILT_SOURCES) 文件。由于这种情况很常见并且 jay 碰巧留下了 y.output 文件,因此您还可以定义一个名为 $(CLEAN_FILES) 的变量,该变量列出了在调用 'make clean' 时要删除的额外文件。(除了您的可执行文件和构建的源代码之外)。


因此,cs-parser.cs 正是以这种方式制作的:

[mono] ~/custom/MONO/mono/mcs/jay @ make
/usr/bin/make all-local
make[1]: Entering directory `/home/sehe/custom/MONO/mono/mcs/jay'
make[1]: Nothing to be done for `all-local'.
make[1]: Leaving directory `/home/sehe/custom/MONO/mono/mcs/jay'

[mono] ~/custom/MONO/mono/mcs/jay @ cd ../mcs

[mono] ~/custom/MONO/mono/mcs/mcs @ make
/usr/bin/make all-local
make[1]: Entering directory `/home/sehe/custom/MONO/mono/mcs/mcs'
./../jay/jay -cv < ./../jay/skeleton.cs cs-parser.jay > jay-tmp.out && mv jay-tmp.out cs-parser.cs
./../jay/jay: 9 shift/reduce conflicts.

(减少输出)

它导致 cs-parser.cs 中有 10470 行非用户可维护的代码


替代方案,开箱即用:

  1. 只是一个想法,你能不使用预处理 c# -> c# 转换器吗?这具有额外的好处,您可以使其与任何 C# 工具/编译器一起使用。考虑使用#linepragma 映射回调试信息的原始源

  2. 此外,还有许多用于 C#/.NET 的面向方面的代码编织器。您可能会利用1.2.的组合来获得您想要的功能?


于 2011-10-30T12:41:53.970 回答