有没有研究过函数自动分解工具

专注VB编程开发20年 2019-02-23 02:50:34
有没有研究过函数自动分解工具?把一个编程工程中的多个模块中的每一个过程函数用代码“分解”提取出来,把窗体,模块也分解出来。
目标就像是做一个把手机电路板的CPU,内存屏幕等自动拆解的智能机器人。
把编程的基础元素提练出来,然后做高度整合,提高代码复用率,窗体,模块做到一次编写永久使用的目的,达到1+1=2,2+2=4,100次之后那将是无穷大了。1+1+1+**,100次也只有100.如果你的工资这个月1万,下个月2万,那****
...全文
544 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 6 楼 脆皮大雪糕 的回复:
把dim提前,给你写了一段试试看。 后来觉得只是提前太没有意思了,把格式化缩进也给你做了个样例。只是个例子,里面的关键字列得不全,需要的话自己再加。 假设你输入的都是function 或者sub哈,其他的你自己添加代码。 至于提取参数个数,懒得写代码了,就是第一行取()中间的部分用逗号split一下,再去逐个分析就了事了。
---- '去他妈的所有换行连接 strTmp = Replace(strin, " _" & vbCrLf, " ") '去他妈的冒号并行,当然这边可能把字符串里面的冒号也折行了,自己改进一下吧 ------------- 最难处理的就是换行连接符,如果他在注释中咋弄?就会有几行注释。 另外我主要的难点不是代码缩进。 本意是想直接在原来乱乱的格式下进行代码解析:提取函数名,私有还是公用,有几个参数,函数的类型是什么。(重点就是处理前面一行) 另外如果可行,能够替换里面的内置函数或自定函数的调用就更强了。 主要是用于如果想升级工程,替换下一些旧函数,参数可能增加了,也可能变换了参数顺序(原来参数3变成了“参数1”) 当然这就不是简单的替换字符串就能完成了。所以解析能力要比较强,我脑子短路了,不知咋实现。
脆皮大雪糕 2019-03-04
  • 打赏
  • 举报
回复
把dim提前,给你写了一段试试看。 后来觉得只是提前太没有意思了,把格式化缩进也给你做了个样例。只是个例子,里面的关键字列得不全,需要的话自己再加。 假设你输入的都是function 或者sub哈,其他的你自己添加代码。 至于提取参数个数,懒得写代码了,就是第一行取()中间的部分用逗号split一下,再去逐个分析就了事了。

Option Explicit

Private Sub Command1_Click()
Dim strTest As String
strTest = strTest & "    Private _" & vbCrLf
strTest = strTest & "Function jia2(a As Long, _" & vbCrLf
strTest = strTest & "ByVal b As Integer) As Long '加法  函数" & vbCrLf
strTest = strTest & "    jia = a + b: Dim k    As Long: k = 3" & vbCrLf
strTest = strTest & "Dim S: S = ""中国人  "" '88382':" & vbCrLf
strTest = strTest & "if 1=1 then" & vbCrLf
strTest = strTest & "for i = 1 to 100" & vbCrLf
strTest = strTest & "doevents:debug.print i " & vbCrLf
strTest = strTest & "next " & vbCrLf
strTest = strTest & "elseif 1=2 then " & vbCrLf
strTest = strTest & "doevents:debug.print i " & vbCrLf
strTest = strTest & "else " & vbCrLf
strTest = strTest & "doevents:debug.print i " & vbCrLf
strTest = strTest & "end if " & vbCrLf
strTest = strTest & "End _" & vbCrLf
strTest = strTest & "Function"

Debug.Print strTest
Debug.Print vbCrLf & "分隔线---------------------------" & vbCrLf
Debug.Print formatVBcode(strTest)
End Sub
Private Function formatVBcode(ByVal strin As String) As String

    Dim strTmp As String
    Dim aryTmp() As String
    Dim colcode As New Collection
    Dim i As Long, j As Long
    Dim lngDimRow As Long, lngTabCnt As Long
    Dim strTab As String
    '去他妈的所有换行连接
    strTmp = Replace(strin, " _" & vbCrLf, " ")
    '去他妈的冒号并行,当然这边可能把字符串里面的冒号也折行了,自己改进一下吧。
    strTmp = Replace(strTmp, ":", vbCrLf)
    '按行拆分
    aryTmp = Split(strTmp, vbCrLf)
    '去空行,去前后空格,然后塞进我个人喜欢的集合
    For i = LBound(aryTmp) To UBound(aryTmp)
        If aryTmp(i) <> "" Then
            colcode.Add Trim(aryTmp(i))
        End If
    Next
    
    lngDimRow = 2
    
    
    For i = 2 To colcode.Count - 1 '第一行和第二行懒得处理了,
        If GetKeyWord(colcode(i)) = "DIM" Then '遇到dim,加挪到最前面去
            colcode.Add colcode(i), , lngDimRow
            colcode.Remove i + 1
        End If
    Next
    
    '添加缩进,输出
    lngTabCnt = 1
    formatVBcode = formatVBcode & Trim(colcode(1)) & vbCrLf
    For i = 2 To colcode.Count - 1 '第一行和第二行懒得处理了,
        strTab = Replace(Space(lngTabCnt * 4), "    ", vbTab) '需要缩进的tab
        If GetKeyWord(colcode(i)) = "IF" Or GetKeyWord(colcode(i)) = "FOR" Then '遇到 if 和 for 则后续的行家一格缩进 当然,还有其他关键字,自己添加,懒得写了
            formatVBcode = formatVBcode & strTab & colcode(i) & vbCrLf '本行加上缩进
            lngTabCnt = lngTabCnt + 1
        ElseIf GetKeyWord(colcode(i)) = "NEXT" Or GetKeyWord(colcode(i)) = "END" Then '本行及后续向前一格
            lngTabCnt = lngTabCnt - 1
            strTab = Replace(Space(lngTabCnt * 4), "    ", vbTab)
            formatVBcode = formatVBcode & strTab & colcode(i) & vbCrLf
        ElseIf GetKeyWord(colcode(i)) = "ELSEIF" Or GetKeyWord(colcode(i)) = "ELSE" Then '本行及后续缩进不变
            strTab = Replace(Space((lngTabCnt - 1) * 4), "    ", vbTab)
            formatVBcode = formatVBcode & strTab & colcode(i) & vbCrLf
        Else
            formatVBcode = formatVBcode & strTab & colcode(i) & vbCrLf
        End If
    Next
    formatVBcode = formatVBcode & Trim(colcode(colcode.Count - 1))
    
End Function

Private Function GetKeyWord(strin As String)
    Dim i As Integer
    i = InStr(1, strin, " ")
    If i > 1 Then
        GetKeyWord = UCase(Left(strin, InStr(1, strin, " ") - 1))
    Else
        GetKeyWord = UCase(strin)
    End If
End Function

  • 打赏
  • 举报
回复
拆IPHONE5不能用于IHPONE8,这就像是VB6的代码不能用于VB.NET。 但是VB6相当于IPHONE5,所有的代码可以互换。而且这个产品20几年了一直活着。 当然也可以直接就上升到VB.NET,原理是一样的。 写一个代码分析工具,把模块拆解,再拆解函数,最后每一行的变量,字符串全能识别出来。 就是想弄一个代码工具,把一些网上下载的工程进行拆解,把有用的函数用起来,不过一般情况下,手工复制出来也够用了。 想省点事
  • 打赏
  • 举报
回复
比如下面的函数,怎么拆解出来分析。 函数类型:SUB还是FUNCTION 有几个参数,每个参数类型,是否有默认值,函数用了几个变量 把函数整理成标准写法格式,把所有的变量定义放在函数最前面。 怎么写个代码实现这个功能?
    Private _
Function jia2(a As Long, _
ByVal b As Integer) As Long '加法  函数
    jia = a + b: Dim k    As Long: k = 3
Dim S: S = "中国人  " '88382':"
End _
Function
脆皮大雪糕 2019-02-25
  • 打赏
  • 举报
回复
你拆一堆废旧iphone5,这些零件可以组合出一台可以用的iphone5。 你拆一堆废旧的note2,这些零件可以组合出一台可以用的note2。 你把iPhone4和note2的零件堆在一起,你除了iphone5和note2之外并不能拼出新的机型。因为他们内部的接口、孔洞、尺寸都不是标准化的。除了自己的那一堆,和别家的不兼容,除非你对这些模块进行修改。当然,并不排除有些相同的芯片可以互换使用,因为他们的输入输出相同、内部逻辑相同、外形尺寸相同…… 我们的程序也一样,你把你的函数原原本本的拷贝到别的工程里面立马能用?除了一些标准的公共函数、API之类的可以替换,但是芯片可能坏了替换一下,代码除非函数版本不同,要不然有啥好替换的。
threenewbee 2019-02-24
  • 打赏
  • 举报
回复
英语中有一句谚语叫做No Silver Bullet,有一本书就叫这个,翻译成中文叫做《没有银弹》 这个“银弹”可以指很多东西,包括lz说的这个。

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧