VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 24289|回复: 74

[原创] C Func To VB 转换器(大家不要抱太大希望)

[复制链接]
 楼主| 发表于 2009-12-1 11:06:51 | 显示全部楼层 |阅读模式
本帖最后由 VBProFan 于 2009-12-1 11:57 编辑

整个工程转是不太可能滴~,但是转一个函数还是有可能滴~,本程序就用于转换一个C函数。对C代码做了很多假设,假设它是按一定规范写的,而且还有很多功能没有实现,所以大家不要抱太大希望。我只是抛砖引玉,希望对此有兴趣的朋友来继续完成。

核心函数:

  1.   Dim s As String
  2.   Dim p As Long
  3.   Dim rb As Long
  4.   Dim sVCFor As String
  5.   Dim sVBFor As String
  6.   Dim sLoopVar As String
  7.   Dim i As Long
  8.   Dim Brace As Integer
  9.   Dim lb As Long
  10.   Dim sFuncDefLine  As String
  11.   Dim sWord() As String
  12.   Dim sKeyWords As Variant
  13.   Dim bIsFuncName As Boolean
  14.   Dim j As Byte
  15.   Dim sFuncName As String
  16.   Dim sVar As String
  17.   Dim sExpToAdd As String
  18.   
  19.   '输入
  20.   s = txtVCCode.Text
  21.   
  22.   '处理注释、判断符、运算符、关键字
  23.   s = Replace(s, "// ", "'")
  24.   s = Replace(s, "!=", "<>")
  25.   s = Replace(s, "==", "=")
  26.   s = Replace(s, "&&", " and ")
  27.   s = Replace(s, "||", " or ")
  28.   s = Replace(s, "^", " xor ")
  29.   s = Replace(s, "[", "(")
  30.   s = Replace(s, "]", ")")
  31.   s = Replace(s, "break", "Exit For 'Do") '不完美,最好是自动判断
  32.   s = Replace(s, "continue", "GoTo continue") '不完美,应该找到最近的 Next 加上不同的标号如“cont1:”、“cont2:”等等
  33.   '其他待完成的功能:
  34.   '1. 函数定义的转换
  35.   '2. 变量定义的转换
  36.   '3. else 和 else if 的处理
  37.   '4. ++,--,-=
  38.   '5. 多参数函数的调用
  39.   
  40.   '处理 for 语句
  41.   p = 0
  42.   Do
  43.     p = InStr(p + 1, s, "for")
  44.     If p <> 0 Then
  45.       rb = InStr(p + 1, s, ")")
  46.       sVCFor = Mid$(s, p, rb + 1 - p)
  47.       sVBFor = TranslateFor(sVCFor, sLoopVar)
  48.       s = Left$(s, p - 1) & sVBFor & Right$(s, Len(s) - p - Len(sVCFor))
  49.       p = InStr(p + Len(sVBFor), s, "{")
  50.       
  51.       Brace = 0
  52.       For i = p To Len(s)
  53.         If Mid$(s, i, 1) = "{" Then
  54.           Brace = Brace + 1
  55.         ElseIf Mid$(s, i, 1) = "}" Then
  56.           Brace = Brace - 1
  57.         End If
  58.         If Brace = 0 Then
  59.           s = Left$(s, i - 1) & "Next " & sLoopVar & Right$(s, Len(s) - i)
  60.           Mid(s, p, 1) = " "
  61.           Exit For
  62.         End If
  63.       Next i
  64.     End If
  65.   Loop Until p = 0
  66.   
  67.   '处理 if 语句(目前还没考虑有 else 分支的情况)
  68.   p = 0
  69.   Do
  70.     p = InStr(p + 1, s, "if")
  71.     If p <> 0 Then
  72.       lb = InStr(p + 1, s, "{")
  73.       s = Left$(s, lb - 1) & " Then" & Right$(s, Len(s) - lb)
  74.       p = lb + 4
  75.       
  76.       Brace = 1
  77.       For i = p To Len(s)
  78.         If Mid$(s, i, 1) = "{" Then
  79.           Brace = Brace + 1
  80.         ElseIf Mid$(s, i, 1) = "}" Then
  81.           Brace = Brace - 1
  82.         End If
  83.         If Brace = 0 Then
  84.           s = Left$(s, i - 1) & "End If" & Right$(s, Len(s) - i)
  85.           Exit For
  86.         End If
  87.       Next i
  88.     End If
  89.   Loop Until p = 0
  90.   s = Replace(s, "if", "If")
  91.   
  92.   '把 return 替换为函数名,假设第二行是函数定义
  93.   sFuncDefLine = Split(s, vbCrLf)(1)
  94.   sWord = Split(sFuncDefLine)
  95.   sKeyWords = Array("static", "int", "void", "inline")
  96.   For p = 0 To UBound(sWord)
  97.     bIsFuncName = True
  98.     For i = 0 To UBound(sKeyWords)
  99.       If sWord(p) = sKeyWords(i) Then
  100.         bIsFuncName = False
  101.         Exit For
  102.       End If
  103.     Next i
  104.     If bIsFuncName Then
  105.       j = InStr(sWord(p), "(")
  106.       sFuncName = Left$(sWord(p), j - 1)
  107.       Exit For
  108.     End If
  109.   Next p
  110.   
  111.   p = 0
  112.   Do
  113.     p = InStr(p + 1, s, "return")
  114.     If p <> 0 Then
  115.       s = Left$(s, p - 1) & sFuncName & " = " & Right$(s, Len(s) - p - 6)
  116.       i = InStr(p + 1, s, ";")
  117.       s = Left$(s, i - 1) & vbCrLf _
  118.         & "    Exit Function" & vbCrLf _
  119.         & Right$(s, Len(s) - i - 1)
  120.       
  121.     End If
  122.   Loop Until p = 0
  123.   
  124.   '处理 +=
  125.   p = 0
  126.   Do
  127.     p = InStr(p + 1, s, "+=")
  128.     If p <> 0 Then
  129.       i = p - 2 '假设 += 和左边的变量名只有一个空格
  130.       Do
  131.         i = i - 1
  132.       Loop Until i = 1 Or Mid$(s, i, 1) = " " '假设变量的左侧有空格而不是在行首
  133.       sVar = Trim$(Mid$(s, i, p - i))
  134.       i = InStr(p + 2, s, ";")
  135.       sExpToAdd = Trim$(Mid$(s, p + 2, i - p - 2))
  136.       s = Left$(s, p - 1) & " = " & sVar & " + (" & sExpToAdd & ")" & Right$(s, Len(s) - p - 2 - Len(sExpToAdd))
  137.     End If
  138.   Loop Until p = 0
  139.   
  140.   '去掉分号
  141.   s = Replace(s, ";", "")
  142.   
  143.   '输出
  144.   txtVBCode.Text = s

复制代码
其他函数:
游客,如果您要查看本帖隐藏内容请回复


相关链接:
http://www.vbgood.com/viewthread.php?tid=71433
http://www.vbgood.com/viewthread.php?tid=65073&pid=369778&page=1&extra=#pid369778
http://www.vbgood.com/viewthread.php?tid=79092

评分

参与人数 5威望 +17 人气 +5 收起 理由
xwy666 + 1 + 1 很给力!
jiangxh97 + 1 + 1 我很赞同
eaaca1234 + 4 + 1 牛叉
hovidelphic + 6 + 1 路过要膜拜
19900603 + 5 + 1 原创内容

查看全部评分

发表于 2009-12-1 11:11:36 | 显示全部楼层
还要回复才能看呀, 看看
回复 支持 反对

使用道具 举报

发表于 2009-12-1 11:45:15 | 显示全部楼层
我怀疑转换器是存在的,因为我有一次下载了个老外的开源科学计算库,有VB的也有C的源代码,那个VB代码风格很奇怪,不像是用VB的人写的,我怀疑就是用转换器转的……
回复 支持 反对

使用道具 举报

发表于 2009-12-1 11:59:01 | 显示全部楼层
回pjz,可能是用格式美化器吧,转换器转的一般用不了
回复 支持 反对

使用道具 举报

发表于 2009-12-1 12:08:58 | 显示全部楼层
顶了 支持 LZ 精神可嘉
回复 支持 反对

使用道具 举报

发表于 2009-12-1 21:23:34 | 显示全部楼层
不过的确靠机器来大量的转换一些函数名和一些常量变量等是蛮不错的!起码我不想把时间浪费在打字哪儿!呵呵
回复 支持 反对

使用道具 举报

发表于 2009-12-1 22:03:33 | 显示全部楼层
??中~~~
回复 支持 反对

使用道具 举报

发表于 2009-12-1 22:26:26 | 显示全部楼层
嗯嗯
回复 支持 反对

使用道具 举报

发表于 2009-12-2 01:21:33 | 显示全部楼层
膜拜VBProFan。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-4 07:35:16 | 显示全部楼层

改进一:

本帖最后由 VBProFan 于 2009-12-4 07:36 编辑


  s = Replace(s, "[", "(")
  s = Replace(s, "]", ")")
移到
  s = Replace(s, ";", "")
的前面,然后在它们的前面插入这一段:

  1.   '处理 int
  2.   p = 0
  3.   Do
  4.     p = InStr(p + 1, s, "int")
  5.     If p <> 0 Then
  6.       i = InStr(p + 3, s, ";")
  7.       If InStr(Mid$(s, p + 3, i - p), ")") = 0 Then
  8.         sDelcLine = Mid$(s, p, i - p + 1)
  9.         sIntVar = Split(Mid$(s, p, i - p), ",")
  10.         sIntVar(0) = Split(sIntVar(0))(1)
  11.         sIntDeclare = ""
  12.         For j = 0 To UBound(sIntVar)
  13.           sIntVar(j) = Trim$(sIntVar(j))
  14.           k1 = InStr(sIntVar(j), "[")
  15.           If k1 > 0 Then
  16.             k2 = InStr(sIntVar(j), "]")
  17.             sIntVar(j) = Left$(sIntVar(j), k1) & "0 To " & Mid$(sIntVar(j), k1 + 1, k2 - k1 - 1) & " - 1" & Right$(sIntVar(j), 1)
  18.           End If
  19.           sIntDeclare = sIntDeclare & IIf(j = 0, "", "  ") & "Dim " & sIntVar(j) & " As Long" & vbCrLf
  20.         Next j
  21.         s = Left$(s, p - 1) & sIntDeclare & Right$(s, Len(s) - p - Len(sDelcLine))
  22.       End If
  23.     End If
  24.   Loop Until p = 0

复制代码


开头的一段加入:
  s = Replace(s, "!", " Not ")
(注意:要在   s = Replace(s, "!=", "<>") 的后面)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-3 16:20

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表