3

vera++ 静的アナライザーのルールを作成しようとしています。ここで vera++ のグループが見つからず、その vera++ は TCL を使用して分析用のルールを実装しているため、TCL フォーラムに投稿しました。私は vera++ inspirel.com/vera/ce/doc/tclapi.html に取り組んできましたが、TCL をあまり知らないので、さらにアプローチするためのアドバイスが欲しかったのです。

私はTCLプログラミングの初心者ですが、C++ソースコードファイル内のすべてのローカル変数をリストするTCLプログラムのアプローチを知りたいですか? つまり、どのようなアプローチで、どのように達成できるのでしょうか?

私が直面している問題は、ローカル変数の宣言を検出するために C++ ソース コード ファイルを解析しているときですか?

4

2 に答える 2

4

vera ++ルールを使用してローカル(またはその他の)変数定義を解析するのはかなり複雑ですが、もちろん実行可能です。基本的なC++の解析とトークン化は、vera++によって行われます。

getTokens基本的なアプローチは、完成したC++ステートメントをチェックする小さなステートマシンと組み合わせてvera++の関数を使用することです。トークンを収集し(後でリストを設定するために変数名が必要になるため、それらの値になる場合もあります)、完全なステートメントが得られるまでそれらを連結する必要があります。完全なステートメントがある場合は、正規表現を使用して、それが変数定義であるかどうかを確認し、部分一致から変数名を抽出できます。{}また、それがローカル変数定義であるかどうかを知るために、ブロック内にいるかどうかを覚えておく必要があります。

開始点として、コードの完全な中括弧付きブロックをチェックする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>#、正規表現グループを使用してそれを抽出していることに注意してください。

于 2012-10-30T16:04:32.517 に答える
1

残念ながら、あなたはタスクの複雑さを大幅に過小評価していると思います。問題は、C++ 標準で定義されているように実際に解析しない限り、C++ ファイルの内容について推測することは (どんなに教育を受けていても) できないことです。これを行うのは非常に困難です。

このような構文解析を実装するためにどのプログラミング言語を使用するかという問題は、それほど重要ではないことは明らかです。確かにこれを Tcl で実装できますが、現在の形式で適切に回答することは、実際には既製のパーサー コードを投稿することになるため、質問は具体的ではありません。

于 2012-10-30T13:30:56.613 に答える