JavaCCで既に生成されたAbstract-Syntax-Treeから制御フローグラフを構築するために、LEParserCfgVisitorクラスを実装する方法を理解しようとしています。すでに存在するツールがあることは知っていますが、コンパイラの最終版に備えてそれをやろうとしています。
グラフをメモリに保持するデータ構造が必要であることはわかっており、後で制御フロー分析を実行できるように、各ノードで IN、OUT、GEN、KILL などの属性を保持できるようにしたいと考えています。
私の主な問題は、分岐、ループなどの性質に応じて各ブロック間に正しいエッジを持たせるために、さまざまなブロックを一緒に接続する方法を理解していないことです。つまり、明示的なビジターの作成に役立つアルゴリズム。
これが私の空のビジターです。if、while、基本演算 (+、-、x、^、...) などの基本的な言語式で動作することがわかります。
public class LEParserCfgVisitor implements LEParserVisitor
{
public Object visit(SimpleNode node, Object data) { return data; }
public Object visit(ASTProgram node, Object data) {
data = node.childrenAccept(this, data);
return data;
}
public Object visit(ASTBlock node, Object data) {
}
public Object visit(ASTStmt node, Object data) {
}
public Object visit(ASTAssignStmt node, Object data) {
}
public Object visit(ASTIOStmt node, Object data) {
}
public Object visit(ASTIfStmt node, Object data) {
}
public Object visit(ASTWhileStmt node, Object data) {
}
public Object visit(ASTExpr node, Object data) {
}
public Object visit(ASTAddExpr node, Object data) {
}
public Object visit(ASTFactExpr node, Object data) {
}
public Object visit(ASTMultExpr node, Object data) {
}
public Object visit(ASTPowerExpr node, Object data) {
}
public Object visit(ASTUnaryExpr node, Object data) {
}
public Object visit(ASTBasicExpr node, Object data) {
}
public Object visit(ASTFctExpr node, Object data) {
}
public Object visit(ASTRealValue node, Object data) {
}
public Object visit(ASTIntValue node, Object data) {
}
public Object visit(ASTIdentifier node, Object data) {
}
}
誰か手を貸してくれませんか?
ありがとう!