首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析VB6语法

解析VB6语法
EN

Stack Overflow用户
提问于 2011-11-30 08:24:35
回答 3查看 3K关注 0票数 4

我需要向现有的VB6应用程序注入一些代码。

我想要做的是将日志记录代码添加到数百个vb6文件中的每个方法的顶部,记录方法名称和带有值的参数。

代码的编写很容易,但是在VB6语法中方法或属性头的匹配是我遇到的一个难题,因为似乎有大量的变体和可选关键字。

有没有人对如何做到这一点有什么建议?我尝试过使用RegEx,但失败了,我求助于对代码进行标记化并寻找令牌模式。

EN

回答 3

Stack Overflow用户

发布于 2011-11-30 09:23:35

将其编写为VB6插件可能会更容易,这样您就可以枚举所有模块/过程并插入适合的代码。

或者,使用MZTools,它是免费的,可以自动向单个过程或新过程添加标头。

票数 17
EN

Stack Overflow用户

发布于 2011-11-30 08:37:19

对于这样的项目,您可能需要比正则表达式更健壮的东西。我不知道目前是否有任何开放源码VB6解析器实现,但我建议您使用合适的工具。如果您要推广在编译时注入代码的方法,则此活动有时称为Aspect Oriented Programming或Mixins。

我将花一点时间来介绍我自己的工具meta#,它允许您为这些类型的场景构建模式匹配语法,但您也可以使用许多其他工具之一,如Lexx/Yacc、Flexx/Bison或ANTLR.

但是,即使你不特别使用我的策略,这里也是我解决这个问题的一般策略:

  1. 创建代码转换(预编译)生成步骤
  2. 将文件解析到对象模型中
  3. 将表示日志记录调用的新对象插入到此模型中
  4. 基于该对象生成新代码文件model
  5. Compile生成的代码only.
  6. Generated代码是生成项目,从不编辑或添加到源代码管理。

< code >G215

无论何时构建,都运行此转换步骤。

票数 1
EN

Stack Overflow用户

发布于 2011-11-30 10:57:14

我们的DMS Software Reengineering Toolkit和它的Visual Basic front end可以用来做这件事。

DMS使用前端解析源文本以抽象语法树,然后允许对这些树应用任意分析/转换。许多转换更改都可以使用source-to-source program transformation完成,其中使用“如果您看到此语法,请将其替换为那个语法”重写代码,并将此语法用作定义抽象占位符的一种方式。这使得使用熟悉的语法在代码上编写转换相对容易。这推广了OP尝试匹配标记序列的方法。

OP的问题可以假设为类似于表单重写的方面:

代码语言:javascript
运行
复制
 default domain VisualBasic~VB6;

 rule function_insert_log_call(a: attributes, t: type,
                               i: IDENTIFIER, p: parameters, s:statements) 
    = function -> function
 = " \a FUNCTION \i ( \p ) AS \t
        \s
     END FUNCTION"
 -> "\a FUNCTION \i ( \p ) AS \t
        my_log(\tostring\(\i\))
        \s
     END FUNCTION";

 rule subroutine_insert_log_call(a: attributes,  
                                 i: IDENTIFIER, p: parameters, s:statements)
    = subroutine -> subroutine
 = " \a SUB \i ( \p )
        \s
     END SUB"
 -> " \a SUB \i ( \p )
        my_log(\tostring\(\i\))
        \s
     END SUB";

这些重写的形式是

代码语言:javascript
运行
复制
 rule *rulename* ( *patternvars* ) *nonterminal* -> *nonterminal*
 = " *syntaxpattern* " 
 -> " *syntaxpattern* ";

提供的特定规则将识别函数标头和正文,而不考虑内容/空格/注释,因为它们实际上与and匹配。"...“是metaquotes,外面是DMS规则语法,里面是VB6语法。"...“中的\n表示一个(AST)参数,该参数必须与在规则标头中声明为...n:N...的语法非终端N匹配。tostring是一个自定义元函数(使用meta parens ()调用),它将树节点参数转换为文本字符串的树节点。

OP可能需要更多的规则来处理其他情况;也许他希望记录GOSUB调用,和/或在日志调用中捕获函数参数。

其他答案建议使用解析器生成器,并定义VB6来启用解析。重要的是要理解正确的VB6语法是非常困难的;语言的文档很少,并且有一些关于空格、行内语句和跨行边界的语句的非常奇怪的规则。如果你不能正确理解这一点,你就不能解析数百个文件。我们必须定义自己的语法(就像我们为many other languages的DMS定义的那样)。

您可以阅读有关使用程序转换here进行代码插入/日志记录的更多信息

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8319633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档