C++ 维拉++;TCL规则:列出所有局部变量

C++ 维拉++;TCL规则:列出所有局部变量,c++,tcl,vera++,C++,Tcl,Vera++,我正在尝试为vera++静态分析器编写一个规则。因为我在这里没有找到vera++的组,vera++使用TCL实现其分析规则,所以我将其发布到了TCL论坛。我曾在vera++inspirel.com/vera/ce/doc/tclapi.html上工作过,但由于我对TCL了解不多,因此我希望得到进一步的建议 我是一个初学TCL编程的人,但想知道TCL程序在C++源代码文件中列出所有局部变量的方法吗?我的意思是什么方法以及如何实现 我面对的问题是解析C++源代码文件来检测局部变量声明时, 不幸的是,

我正在尝试为vera++静态分析器编写一个规则。因为我在这里没有找到vera++的组,vera++使用TCL实现其分析规则,所以我将其发布到了TCL论坛。我曾在vera++inspirel.com/vera/ce/doc/tclapi.html上工作过,但由于我对TCL了解不多,因此我希望得到进一步的建议

<>我是一个初学TCL编程的人,但想知道TCL程序在C++源代码文件中列出所有局部变量的方法吗?我的意思是什么方法以及如何实现


我面对的问题是解析C++源代码文件来检测局部变量声明时,

不幸的是,我认为你严重低估了任务的复杂性。问题是,除非你真正按照C++标准定义了它,并且.< /P>,否则你不能对C++文件的内容进行任何猜测(不管如何教育)。
到目前为止,很明显,使用什么编程语言来实现这种解析的问题其实并不那么重要。您当然可以在Tcl中实现这一点,但问题并不具体,因为以当前形式正确回答它实际上等于发布现成的解析器代码。因此,我投票以非建设性的方式结束您的问题,希望您能理解。

使用vera++规则解析局部(或任何其他)变量定义非常复杂,但当然是可行的。基本的C++解析和符号化是用Vela++实现的。 <>基本方法是使用Vela++的代码> GETTokEngs/Cuff>函数,结合一个小的状态机来检查完成的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
包含前面提到的完整语句。请注意,我正在使用
标识符##
将令牌值连接到
标识符
令牌,并使用正则表达式组将其提取。

感谢提供详细信息。实际上,我正在尝试为vera++静态分析器编写一个规则。因为我在这里没有找到vera++的组,vera++使用TCL实现其分析规则,所以我将其发布到了TCL论坛。我曾在vera++上工作过,但由于我对TCL不太了解,我希望得到进一步的建议。@Prakash,你能编辑你的问题并在那里添加这些信息吗?你提供的新信息从根本上改变了你问题的本质,缩小了范围,使之符合so标准。谢谢你的关注-我已按要求更新了原始问题。