首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析器/词法/程序设计语言问题

解析器/词法/程序设计语言问题
EN

Stack Overflow用户
提问于 2011-03-06 08:26:42
回答 4查看 449关注 0票数 5

好吧,所以我并不擅长所有的术语和东西,但到目前为止,我已经创造了如下内容:

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

2:确定字符/字符串'x‘是标识符,还是整数,或者其他什么的应用程序。

第三:另一个应用程序,它将所有内容都放在一起,并创建另一个文件,该文件基本上包含要发送给我的第四个应用程序的指令,大致如下:

将Integer oldValue的值分配给Integer newValue。

然后,我的第四个应用程序接收到这个指令,并“编译”它(在本例中,我只想解释它),然后创建一个应用程序:

代码语言:javascript
复制
int newValue = oldValue;

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

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

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

EN

回答 4

Stack Overflow用户

发布于 2011-03-06 08:39:10

有几个选项可以从指令列表生成EXE。所有选项都涉及到将指令转换为不同语言的元素。

  • 您可以生成C#源代码并使用C#编译器:System.CodeDom编译结果。
  • 您可以生成IL指令并将结果程序集保存到磁盘:System.Reflection.Emit
  • 您可以构建表达式树,而不是生成IL指令:System.Linq.Expressions
票数 2
EN

Stack Overflow用户

发布于 2011-03-06 09:04:51

使用我在注释中提供的内容,这是一个简单的可执行创建的真正工作示例:

代码语言:javascript
复制
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);
        }
    }
}

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

此外,您还可以使用表达式,而不是使用ILGenerator

票数 1
EN

Stack Overflow用户

发布于 2011-03-06 08:38:22

在编译阶段,最好使用反射发出API来发出.NET、IL并生成EXE和DLL。

我不想在这里详细介绍所有内容,而是向您介绍下面的MSDN文章为.NET框架创建语言编译器,它包含了一些示例代码,可以帮助您在途中进行操作。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5209465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档