Vera++ TCL规则:列出所有本地变量

3
我正在尝试为vera++静态分析器编写规则。由于我在这里没有找到vera++的组,而vera++使用TCL实现其分析规则,因此我发布了TCL论坛。我已经研究了vera++ inspirel.com/vera/ce/doc/tclapi.html,但由于我不太了解TCL,我想请教如何进一步处理。
由于我是TCL编程的初学者,但想知道用TCL程序列出C++源代码文件中所有局部变量的方法是什么?我的意思是采取什么方法以及如何实现?
我面临的问题是在解析C++源代码文件以检测局部变量声明时遇到了困难。
2个回答

4
使用vera++规则解析本地(或任何其他)变量定义相当复杂,但当然是可行的。 vera++执行基本的C++解析和标记化。
基本方法是使用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#<value>#将令牌值连接到identifier标记,并使用正则表达式组进行提取。


1

很遗憾,我认为你严重低估了这项任务的复杂性。问题在于,除非你按照C++标准进行了真正的解析,否则你无法对C++文件的内容进行任何猜测(即使是有根据的),而这样做极其困难

现在显然应该明白了,用什么编程语言实现这种解析的问题并不那么重要。你当然可以用Tcl来实现这个功能,但问题不具体,正确回答需要发布现成的解析器代码。


感谢提供详细信息。实际上,我正在尝试编写 vera++ 静态分析器的规则。由于在这里没有找到 vera++ 的组,并且 vera++ 使用 TCL 实现其分析规则,因此我发布到了 TCL 论坛。我已经研究过 vera++ http://www.inspirel.com/vera/ce/doc/tclapi.html,但由于我不太了解 TCL,我想寻求进一步的建议。 - Programmer
@Prakash,请问您能否编辑您的问题并添加这些信息呢?您提供的新信息有点彻底地改变了您的问题本质,将其缩小到几乎符合SO标准。 - kostix
感谢关注 - 我已按要求更新了原始问题。 - Programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接