我正在写一些东西,将检查一个函数,并在另一种语言重写该函数,所以基本上如果在我的函数F1内,我有这行代码var x=a.b(1)我如何将函数体分解为符号或"令牌"?
我已经搜索了周围,并认为在System.Reflection.MethodInfo.GetMethodBody的东西会做的技巧,但类似乎不能够有能力做我想要的…
我们还有什么其他的解决方案?
编辑:无论如何,我们可以使用反射获得方法的"方法体"吗?(比如字符串之类的)
编辑2:基本上我想做的是在c#/vb中编写一个程序,当我击中F5 时,序列化函数将(使用反射和)采取整个程序(该程序中的所有类)并将其序列化为单个javascript文件。当然,javascript没有。net库,所以基本上c#/VB程序将限制其类的使用。js库(这是一个用c#/VB编写的库,模拟javascript对象的框架)。
的优点是,我有类型安全,而编码我的javascript类和许多其他的好处,如使用重载和有类等。由于javascript本身没有类/重载特性,它依赖于黑客来完成它。所以基本上序列化函数将为我编写基于c#/VB程序输入的javascript(以及所有的hack和可能的优化)。
我正在尝试编写这个序列化函数
听起来你想要一个解析树,而Reflection不会给你。看看NRefactory,这是一个VB和c#的解析器。
如果你想这样做,最好的方法是用解析器/词法分析器解析c#/VB代码,比如Gardens Point解析器生成器、flex/bison或ANTLR。然后在令牌级别,用适当的javascript语法重新组装它。有一些是针对c#和Java的。
参见分析和转换源代码的答案这个是关于编程语言之间的翻译。
假设您使用传统的编译器方法将文本分解为标记("词法分析")并将相关的标记分组到程序结构中("解析")。如果你的分析不是琐碎的,你将需要所有的机器,否则它将不可靠。
反射只能给你语言设计者决定给你的东西。它们总是不给你函数内部的细节。
如果您想从IL转换到其他语言,这可能比先解析源语言更容易。如果你想走这条路,可以考虑阅读微软的"Volta"项目(IL->JavaScript),虽然该项目不再可用,但仍有老博客讨论有关它的问题。
请注意,反射本身是不够的-反射为任何特定方法(MethodInfo.GetMethodBody)的主体提供字节数组。GetILAsByteArray - http://msdn.microsoft.com/en-us/library/system.reflection.methodbody.aspx),你必须阅读它。有几个公开的"IL reader"库