论坛首页 Java企业应用论坛

寻求一个语法转换问题的思路和实现时用到的设计模式

浏览 2410 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-12-27  
我要用java做一个转换程序,把一些程序从某个语言的一个版本转换到另一个版本上。程序在语法和结构上有变化,但逻辑上无变化。

这个工作类似于做个C#到VB.NET的转换器,但不完全类似。比如可能把某些方法消除,但方法里的语句写在程序中调用该方法的地方,这个时候会稍微调整语句,但逻辑仍然不变。再比如还可能会出现类似下面的语句转换:
UPDATE PUBLIC.TABLE_A 变成 UPDATE TABLE_A
SET SET
FIELD_A = aaa #FIELD_A,
FIELD_B = bbb #FILED_B
TO
aaa,
bbb

一个语法点可能会涉及到多行。有些语法点之间是独立的,但有些是另外语法点的前提(比如修改A语法就必须修改B语法)

总结下来,需要转换的语法点和结构变化有20多处。

这个问题在综合技术里问过,在本版再问一次是为了寻求解决此问题的思路以及用到的设计模式,多谢了!
   发表时间:2007-12-27  
没理解错的话,应该是需要写一个类似编译器前端这样的东东,看看ajoo老大的jparsec或者antlr
0 请登录后投票
   发表时间:2007-12-27  
跟设计模式无关,跟编译原理有关。说白了你就是在做一个编译器,只不过目标语言也是高级语言罢了。

基本来说比较麻烦,词法分析是肯定要用到的;
但如果源语言和目标语言相似程度比较大,可能会有一些窍门,这个就不清楚了
0 请登录后投票
   发表时间:2007-12-27  
多谢楼上两位!
我先去看看相关资料
0 请登录后投票
   发表时间:2008-01-23  
建议使用Antlr。

btw:我也正在做这样一个类似的转换程序,目前正在用Antlr写代码分析器,可以到我的blog上去看看。http://dohkoos.name。
0 请登录后投票
   发表时间:2008-01-23  
文本转换加上正则式.
0 请登录后投票
   发表时间:2008-01-23  
dohkoos 写道
建议使用Antlr。

btw:我也正在做这样一个类似的转换程序,目前正在用Antlr写代码分析器,可以到我的blog上去看看。http://dohkoos.name。


这样的情况最多只能是局部的用antlr.代码升级的话,很大一部分其实是不用修改的,
LZ也说了大概就20多种情况.(比较重要的一点就是升级的代码可以保证文法结构一般是没有问题的
这样用简单的文本匹配还是比较容易实现的)
1.把20多种情况详细分析,看看有没有能在代码里面直接封装的.
  比如SQL的修改,原来有拼SQL这样形式的代码出现的话,最好
  还是在代码里面把原始的查询API等包一层出来,考虑在运行期
  的SQL文法分析,可以使用简单的正则,也可以使用复杂的解析器.
2.不能在原来的代码API上封装的,没有办法,基本上只能是文本
   正则匹配了,在那些比较复杂的部分可以考虑引入ANTLR之类的
   工具.(全部代码用ANTLR分析,写那个文法文件还是要点时间
   要点基本功的).

总之,能封装API的,就封装替换API,实在不行的先试试正则,没有办法的时候再局部用ANTLR吧.
0 请登录后投票
   发表时间:2008-01-23  
其实这种工作最好是用动态语言的parser generator,比如ruby就有很多,语法很DSL,大大降低了编写难度。antlr很强大,不过学习曲线也比较高。
0 请登录后投票
   发表时间:2008-01-23  
可以看一下ruby的Treetop.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics