私は宿題のテストのためのプラットフォームを維持/開発しています。ほとんど自動です。ここで追加する必要があるのは、コード分析です。特定の構造のコードを確認する必要があります。
例えば:
ファイルには、constメソッドで 名前が
main.cpp
付けられたクラスが含まれていますか?user
get_name()
私がそのようなことをすることを可能にするいくつかのツールがそこにありますか(理想はスクリプト化できるものです)。Linuxのみ。
私は宿題のテストのためのプラットフォームを維持/開発しています。ほとんど自動です。ここで追加する必要があるのは、コード分析です。特定の構造のコードを確認する必要があります。
例えば:
ファイルには、constメソッドで 名前が
main.cpp
付けられたクラスが含まれていますか?user
get_name()
私がそのようなことをすることを可能にするいくつかのツールがそこにありますか(理想はスクリプト化できるものです)。Linuxのみ。
1つの可能性は、 GCCを介してコードを実行し、 GCC-XML拡張機能を使用して、プログラムの内部構造のXML記述を生成することです。次に、お気に入りのXMLライブラリを使用してドキュメントを解析したり、HTMLなどで表示するだけの場合はXSLTを適用したりできます。
おそらく、GCC-XMLフレームワークを使用したものをそれほど困難なく一緒にハックすることができます。
これはどのように適用されC
ますか?:)
ファイルmain.cppには、constメソッドget_name()を持つuserという名前のクラスが含まれていますか?
で別のファイル(test.cpp)を作成します
void test(void) {
const user x;
x.get_name();
}
test.cppとmain.cppを一緒にコンパイルします。エラー(終了コード!= 0)がある場合は、NO!、ファイルmain.cppは、特定のメソッドを持つuserという名前の(パブリック)クラスを定義していません。
警告:私は知らないC++
ので、上記の大きな(または小さな)エラーを許してください。
編集スクリプトが追加されました
#! /bin/sh
cat main.c test.c > 3710532.c
if gcc 3710532.c > /dev/null 2>&1
then echo OK
else echo BZZZT
fi
rm 3710532.c
使用しているこのマシンにはすぐに使用できるC++
コンパイラがインストールされていないため、テストはC
コンパイラとC
ファイルを使用して行いました。私のコンパイラは「動作」しなかったgcc -combine main.c test.c
ので、その部分を微調整しました。
との有効な組み合わせでこのスクリプトを実行すると、main.c
「test.c
OK」が出力されます。それ以外の場合は、「BZZZT」が出力されます。
私がこれを使用したテストのためにmain.c
typedef int user;
int get_name(void) {
return 0;
}
int main(void) {
return 0;
}
このtest.c
void test(void) {
const user x;
get_name();
}
サンプル実行
$ ./3710532.sh わかった
私はMozillaからdehydraツールを発見しました。主に社内向けに書かれているようですが、まさに私が探していたものかもしれません。
https://developer.mozilla.org/En/Dehydra/Using_Dehydra
編集:デヒドラは素晴らしいです。constメソッドの決定など、いくつかのマイナーな機能が欠けていますが、それ以外の点では優れています。
任意のコード分析を行う場合は、任意の解析/マッチングなどが必要です。GCC-XMLは宣言情報を提供しますが、メソッドの内容は提供しません。
DMS Software Reengineering Toolkitは、GCC-XMLと同じ抽象的な情報を提供しますが、C ++フロントエンドでサポートされている定義のコンテンツ(メソッド本体情報など)の完全な詳細を追加で提供します。これにより、生徒のプログラムを確認するための説明やコンテンツにアクセスできるようになります。
DMSは、AST、シンボルテーブル、およびソースパターンマッチングに対する汎用の解析を提供します。C ++フロントエンドは、完全なC ++解析、C ++ ASTの構築、および対応するシンボル情報を提供します。その後、認識のために何をするかはあなた次第ですが、あなたの例は特定のパターンを探すことについてのようです。
例の半分は、C++用のいくつかのDMSソースパターンによって処理されます。
pattern is_correct_student_class(m:members):class =
" class user { \m } ".
pattern is_correct_student_method_present(p:parameters,s:statements):method =
" const get_name(\p) { \s } "
(私のC ++構文を許してください、私はそれをあまり書きません)指定されたユーザークラスと目的のconstメソッドに対応する任意のASTにそれぞれ一致します。引用符はメタ引用符であり、内部のものはC ++構文であり、エスケープ\ p、\ m、および\ sはメタ変数p、m、およびsを表します。これらは構文的にそれぞれパラメーターリスト、メソッドリスト、およびステートメントリストである必要があります。パターンに一致するように。パラメータリストなどの定義は、C++フロントエンドのC++文法部分から自動的に導出されます。
残りの半分は、C++パーサーと名前/タイプリゾルバーを呼び出した後に実行されるDMSPARLANSEコードのビットによって実装されます。
(define has_student_code (lamdba (function boolean [tree AST]))
(AST:IsInTree tree
(lambda (function boolean [tree1 AST]
(&& (Registry:MatchPattern tree1 "is_correct_student_class")
(AST:IsInList (AST:GetNthGrammarChild tree1 4) ; the member list
(lambda (function boolean [tree2 AST])
(Registry:MatchPattern tree2 ; a member
"is_correct_student_method_present")
)lambda
)lambda
)
)define
プレゼンテーションを簡素化するためにいくつかの自由が取られました。
これは非常に簡単なチェックです。PARLANSEコードからシンボルテーブルにアクセスして、それが理にかなっている場合は、より高度なチェックを行うことができます。
DMSはLinuxで直接実行されるわけではありませんが、Wineで実行されるようです。