解析器/词库/编程语言问题

时间:2011-03-06 08:26:43

标签: c# .net winforms dom codedom

好的,所以我对所有条款和内容都不满意,但这是我迄今为止所创造的内容:

1:一个应用程序,逐个字符地读取源代码文件的内容。和;

2:确定字符/字符串'x'是标识符,整数还是其他内容的应用程序。

和3:另一个将所有内容放在一起的应用程序,并创建另一个文件,基本上包含要发送到我的第4个应用程序的说明,基本上是这样的:

  

将Integer oldValue的值分配给Integer newValue。

所以,然后我的第4个应用程序接收到这个指令,并“编译”它(好吧,在这种情况下,我会说我只想解释它),然后创建一个应用程序:

int newValue = oldValue;

因此,由于我已经完成了解析器等,我如何将我的指令转换为导致实际操作的指令,并生成一个EXE文件,因此当我双击该文件时,它将执行上述操作动作?

我希望这不会让你感到困惑。

所以,基本上,我想我要问的是:“我如何以编程方式从字符串创建”事件“,将其保存到文件并生成exe?”

4 个答案:

答案 0 :(得分:2)

有几种方法可以从指令列表中生成EXE。所有选项都涉及您将指令转换为其他语言的元素。

答案 1 :(得分:1)

这是使用我在评论中提供的简单可执行文件创建的真实工作示例:

using System;
using System.Reflection;
using System.Reflection.Emit;

namespace AssemblyGenerator
{
    partial class AssemblyGenerator
    {
        static void Main(string[] args)
        {
            string assemblyName = "Sample";
            string exeName = "Sample.exe";

            AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(assemblyName), AssemblyBuilderAccess.Save);
            ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(exeName);
            TypeBuilder typeBuilder = moduleBuilder.DefineType(assemblyName, TypeAttributes.Public | TypeAttributes.Class);
            MethodBuilder methodBuilder = typeBuilder.DefineMethod("Main", MethodAttributes.Static | MethodAttributes.Public, typeof(void), null);

            assemblyBuilder.SetEntryPoint(methodBuilder, PEFileKinds.ConsoleApplication);

            ILGenerator ilGenerator = methodBuilder.GetILGenerator();
            // BEGIN method IL.
            ilGenerator.EmitWriteLine("This shows on console output.");
            ilGenerator.Emit(OpCodes.Ret);
            // END method IL.

            typeBuilder.CreateType();
            assemblyBuilder.Save(exeName);
        }
    }
}

您可以在方法块中发出代码,如注释所示。

此外,您可以使用LambdaExpression.CompileToMethod Method而不是ILGenerator来使用表达式

答案 2 :(得分:0)

在编译阶段,最好的方法是使用Reflection Emit APIs发出.NET IL并生成EXE和DLL。

我会指向以下MSDN文章Create a Language Compiler for the .NET Framework,而不是进入这里的所有内容,其中包含可以帮助您的示例代码。

另一个选项包括生成C#代码并使用CodeDOM将代码编译到EXE,这将利用C#编译器作为代码生成和最终二进制生成之间的中间步骤。

答案 3 :(得分:0)

最简单的方法可能是让程序生成某种语言的源代码(例如C)并将其输出到您将单独编译的文件中。这样可以省去必须进行代码生成的麻烦。

根据任务的复杂程度,使用Yacc(和Lex)等工具可能更容易。这些允许您指定如何识别您关注的输入部分以及语言的语法,以及识别构造时要输出的内容。您不必为所有C#指定语法,只需指定您关心任务的部分。