As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center提供指导。
已关闭8年。
我正在尝试为vera ++静态分析器编写规则。由于我在这里没有找到vera ++的组,而该vera ++使用TCL来实现其分析规则,因此我发布到了TCL论坛。我从事过vera ++ inspirel.com/vera/ce/doc/tclapi.html的研究,但由于我对TCL的了解不多,因此我希望提供一些建议以进一步解决。
由于我是TCL编程的初学者,但想知道TCL程序在C++源代码文件中列出所有局部变量的方法吗?我的意思是什么方法以及如何实现?
我面临的问题是在解析C++源代码文件以检测局部变量声明时?
已关闭8年。
我正在尝试为vera ++静态分析器编写规则。由于我在这里没有找到vera ++的组,而该vera ++使用TCL来实现其分析规则,因此我发布到了TCL论坛。我从事过vera ++ inspirel.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
将 token 值连接到identifier#<value>#
token ,并使用正则表达式组来提取它。10-04 11:13