就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、参考资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,访问帮助中心 以获得指导。
我正在尝试为 vera++ 静态分析器编写规则。由于我在这里没有找到vera++的小组,并且vera++使用TCL来实现其分析规则,因此我将其发布到TCL论坛。我曾在 vera++spirel.com/vera/ce/doc/tclapi.html 上工作过,但由于我对 TCL 不太了解,所以我需要进一步的建议。
由于我是 TCL 编程的初学者,但想知道 TCL 程序列出 C++ 源代码文件中所有局部变量的方法?我的意思是采取什么方法以及如何实现?
我面临的问题是在解析 C++ 源代码文件以检测局部变量声明时?
使用 vera++ 规则解析本地(或任何其他)变量定义非常复杂,但当然是可行的。基本的 C++ 解析和标记化是由 vera++ 完成的。
基本方法是使用 vera++ 的getTokens
函数与一个小型状态机结合使用,用于检查已完成的 C++ 语句。您需要收集标记(也可能是它们的值,因为稍后您需要变量名称来设置列表)并将它们连接起来,直到获得完整的语句。如果您有完整的语句,则可以使用正则表达式来检查它是否是变量定义并从子匹配中提取变量名称。另外你还需要记住你是否在一个{}
块以了解它是否是局部变量定义。
您可以找到一个构建简单状态机的示例,以将标记收集到 vera++ 规则 T019 中的语句中,该规则检查完整的大括号代码块,作为起点。
我已经用 vera++ 解析了变量定义(以检查各种命名约定),但不幸的是无法发布完整的代码,因为它是我雇主的专有工作。但我可以给你一个片段,显示我用来检查变量声明的正则表达式:
set isVar false
if [regexp {\s+((extern\s+)?(static\s+|mutable\s+|register\s+|volatile\s+)?(const\s+)?)?((identifier#[^#]+#\s+colon_colon\s+)*identifier#[^#]+#)\s+(star\s+|const\s+|and\s+|less.*greater\s+|greater\s+)*(identifier#[^#]+#\s+colon_colon\s+)*identifier#([^#]+)#(\s+leftbracket.*rightbracket)?(\s+assign)?.*semicolon$} $statement m s1 s2 s3 s4 s5 s6 s7 s8 s9 s10] {
set locVarname $s9
set isVar true
set currentMatch $m
} elseif [regexp {\s+((extern\s+)?(static\s+|mutable\s+|register\s+|volatile\s+)?(const\s+)?)?(char\s+|int\s+|short\s+|long\s+|void\s+|bool\s+|double\s+|float\s+|unsigned\s+|and\s+|star\s+|unsigned\s+)+(identifier#[^#]+#\s+colon_colon)*\s+identifier#([^#]+)#(\s+leftbracket.*rightbracket)?(\s+assign)?.*semicolon$} $statement m s1 s2 s3 s4 s5 s6 s7 s8] {
set locVarname $s7
set isVar true
set currentMatch $m
}
$statement
包含前面提到的完整声明。请注意,我将令牌值连接到identifier
令牌使用identifier#<value>#
并使用正则表达式组来提取它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)