日期:2014-05-18  浏览次数:20767 次

用C#语言编写代码,实现两种语言转化
刚学.NET,这是老师布置的题。让我们用C#语言编写代码,实现两种语言转化,如:将C++转换为Java。网上有那种自动翻译的软件,求代码,能实现简单转化的就可以,求各位大神帮忙。

------解决方案--------------------
如果你学过编译原理,可以利用antlr这个工具,在语法文件里定义转换规则,然后用antlr生成代码。楼上有人说了,c++自动转成java是不可能的,因为数据类型很多不匹配。老师的要求可能也只是针对一些简单的数据类型匹配的情况。

下面简述一下思路,以C#转Java为例:

首先下载C#的语法文件,开头几行改为:

grammar cs;

options {
memoize=true;
//output=AST; 缺省是生成抽象语法树,需要改成template,具体参考antlr的手册
output=template;
rewrite=true;//加上这一句,直接生成转换后的代码
language=CSharp2;
}

下面是很多语法规则,举一条为例:
namespace_declaration:
'namespace' qualified_identifier namespace_block ';'? ;
改成:
namespace_declaration
@init
{
StringBuilder sb = new StringBuilder();
}:
'namespace' qualified_identifier namespace_block (t=';')? 
{ sb.Append("package " + $qualified_identifier.text + $namespace_block.text + $t.text);}
-> template(s={sb.ToString()}) "<s>" ;

这样,一句C#的namespace声明语句就会被自动翻译成java的package语句(当然,C#的命名空间和java的命名完全不同,这里只是说明大致思路)
antlr用来做语言自动翻译和代码静态分析工具很合适,花上几个星期研究一下,将受益匪浅。


------解决方案--------------------
如果不用工具,那只有自己写词法和语法分析器。老师可能是想要你们做这方面的练习,并不是要求做一个完全可用的企业级的转换器。
------解决方案--------------------
对,可以入手的路子是利用antlr,yacc这类词法分析工具,解出语法树,然后根据语法树做对应转换

问题在c#和c++是两个不同语义的东西,最典型的比如,指针,内存申请,释放,这类工作,你在c#里就不怎么好替换了。

所以,ls说如果你们老师真是这么要求滴,那么说脑袋被驴踢了我是同意滴
------解决方案--------------------
实际上我到时认为你们老师可能就是让你们学习一下

有关词法分析,编译原理,BNF范式这类玩意

如果真去做,那是非常困难滴。要知道即使SWIG,haxe这两个被经常提到的玩意,在经过这么多年的发展以后,然后只能算马马虎虎,聊胜于无!象征意义大于实用意义的东西