ROSE 編譯器框架/抽象語法樹
ROSE 的主要中間表示形式是其抽象語法樹 (AST)。要使用程式語言,您必須熟悉語言語法、語義等。要使用 ROSE,您必須熟悉其對輸入程式碼的內部表示。
瞭解 AST 的最佳方法是使用最簡單的程式碼示例對其進行視覺化。
視覺化 ROSE AST 需要三樣東西
- 示例輸入程式碼:您提供
- 從 AST 生成 dot 檔案的 dot 圖生成器:ROSE 提供 dot 圖生成器
- 用於開啟 dot 圖的視覺化工具:ROSE 開發人員使用 ZGRViewer 和 Graphviz
如果您不想從頭開始安裝 ROSE+ZGRview + Graphvis,您可以直接使用ROSE 虛擬機器映象,其中已安裝和配置了您需要的所有內容,因此您只需視覺化您的示例程式碼。
請準備最簡單的輸入程式碼,不要包含任何標頭檔案,這樣您就可以獲得足夠小的 AST 來消化。
我們提供 ROSE_INSTALLATION_TREE/bin/dotGeneratorWholeASTGraph(複雜圖形)和 dotGenerator(一個更簡單的版本)來生成輸入程式碼詳細 AST 的 dot 圖。
用於以 dot 格式生成 AST 圖的工具。有兩個版本
- dotGenerator:簡單的 AST 圖生成器,顯示基本節點和邊
- dotGeneratorWholeASTGraph:完整的 AST 圖,顯示更多細節。它提供過濾選項以顯示/隱藏某些 AST 資訊。
命令列
dotGeneratorWholeASTGraph yourcode.c // it is best to avoid including any header into your input code to have a small enough tree to visualize.
跳過內建函式
- dotGeneratorWholeASTGraph -DSKIP_ROSE_BUILTIN_DECLARATIONS yourcode.c
dotGeneratorWholeASTGraph -rose:help
-rose:help show this help message
-rose:dotgraph:asmFileFormatFilter [0|1] Disable or enable asmFileFormat filter
-rose:dotgraph:asmTypeFilter [0|1] Disable or enable asmType filter
-rose:dotgraph:binaryExecutableFormatFilter [0|1] Disable or enable binaryExecutableFormat filter
-rose:dotgraph:commentAndDirectiveFilter [0|1] Disable or enable commentAndDirective filter
-rose:dotgraph:ctorInitializerListFilter [0|1] Disable or enable ctorInitializerList filter
-rose:dotgraph:defaultFilter [0|1] Disable or enable default filter
-rose:dotgraph:defaultColorFilter [0|1] Disable or enable defaultColor filter
-rose:dotgraph:edgeFilter [0|1] Disable or enable edge filter
-rose:dotgraph:expressionFilter [0|1] Disable or enable expression filter
-rose:dotgraph:fileInfoFilter [0|1] Disable or enable fileInfo filter
-rose:dotgraph:frontendCompatibilityFilter [0|1] Disable or enable frontendCompatibility filter
-rose:dotgraph:symbolFilter [0|1] Disable or enable symbol filter
-rose:dotgraph:emptySymbolTableFilter [0|1] Disable or enable emptySymbolTable filter
-rose:dotgraph:typeFilter [0|1] Disable or enable type filter
-rose:dotgraph:variableDeclarationFilter [0|1] Disable or enable variableDeclaration filter
-rose:dotgraph:variableDefinitionFilter [0|1] Disable or enable variableDefinitionFilter filter
-rose:dotgraph:noFilter [0|1] Disable or enable no filtering
Current filter flags' values are:
m_asmFileFormat = 0
m_asmType = 0
m_binaryExecutableFormat = 0
m_commentAndDirective = 1
m_ctorInitializer = 0
m_default = 1
m_defaultColor = 1
m_edge = 1
m_emptySymbolTable = 0
m_expression = 0
m_fileInfo = 1
m_frontendCompatibility = 0
m_symbol = 0
m_type = 0
m_variableDeclaration = 0
m_variableDefinition = 0
m_noFilter = 0
要視覺化生成的 dot 圖,您必須安裝
- Graphviz:http://www.graphviz.org/Download.php。
- ZGRViewer:http://zvtm.sourceforge.net/zgrviewer.html#download。(建議使用 0.8.x 版本,因為 0.9.x 存在一些錯誤,例如拖動圖形時的反向(反轉)方向。)
請注意,您必須配置 ZGRViewer 以使其擁有其使用的某些命令的正確路徑。您可以從其配置/設定選單項中執行此操作。或直接修改文字配置檔案(.zgrviewer)。
下面顯示了一個示例配置(cat .zgrviewer)
<?xml version="1.0" encoding="UTF-8"?>
<zgrv:config xmlns:zgrv="http://zvtm.sourceforge.net/zgrviewer">
<zgrv:directories>
<zgrv:tmpDir value="true">/tmp</zgrv:tmpDir>
<zgrv:graphDir>/home/liao6/svnrepos</zgrv:graphDir>
<zgrv:dot>/home/liao6/opt/graphviz-2.18/bin/dot</zgrv:dot>
<zgrv:neato>/home/liao6/opt/graphviz-2.18/bin/neato</zgrv:neato>
<zgrv:circo>/home/liao6/opt/graphviz-2.18/bin/circo</zgrv:circo>
<zgrv:twopi>/home/liao6/opt/graphviz-2.18/bin/twopi</zgrv:twopi>
<zgrv:graphvizFontDir>/home/liao6/opt/graphviz-2.18/bin</zgrv:graphvizFontDir>
</zgrv:directories>
<zgrv:webBrowser autoDetect="true" options="" path=""/>
<zgrv:proxy enable="false" host="" port="80"/>
<zgrv:preferences antialiasing="false" cmdL_options=""
highlightColor="-65536" magFactor="2.0" saveWindowLayout="false"
sdZoom="false" sdZoomFactor="2" silent="true"/>
<zgrv:plugins/>
<zgrv:commandLines/>
</zgrv:config>
您還必須配置 run.sh 指令碼以使其擁有正確的路徑
cat run.sh
#!/bin/sh # If you want to be able to run ZGRViewer from any directory, # set ZGRV_HOME to the absolute path of ZGRViewer's main directory # e.g. ZGRV_HOME=/usr/local/zgrviewer ZGRV_HOME=/home/liao6/opt/zgrviewer-0.8.1 java -jar $ZGRV_HOME/target/zgrviewer-0.8.1.jar "$@"
一個完整的示例
# make sure the environment variables(PATH, LD_LIBRARY_PATH) for the installed rose are correctly set which dotGeneratorWholeASTGraph ~/workspace/masterClean/build64/install/bin/dotGeneratorWholeASTGraph # run the dot graph generator dotGeneratorWholeASTGraph -c ttt.c #see it which run.sh ~/64home/opt/zgrviewer-0.8.2/run.sh run.sh ttt.c_WholeAST.dot
我們將一些示例原始檔及其 AST 轉儲檔案放入:https://github.com/chunhualiao/rose-ast
- 例如:https://github.com/chunhualiao/rose-ast/blob/master/func1.c_WholeAST.dot.png
- https://github.com/chunhualiao/rose-ast/blob/master/parallelfor.c_WholeAST.dot.png
SageInterface 函式
// You can call the following functions with gdb //! Pretty print AST horizontally, output to std output void SageInterface::printAST (SgNode* node); //! Pretty print AST horizontally, output to a specified text file void SageInterface::printAST (SgNode* node, const char* filename); //! Pretty print AST horizontally, output to a specified text file. void SageInterface::printAST2TextFile (SgNode* node, const char* filename, bool printTypes=true);
一個翻譯器 (textASTGenerator) 也可用,其原始碼位於 exampleTranslators/defaultTranslator 下。
- make install-tools 將安裝此工具
- textASTGenerator input.c 將生成整個 AST 的文字輸出
- 將 AST 的一部分列印到螢幕上
- 將 AST 的一部分列印到文字檔案中
(gdb) up
#7 0x00007ffff418ab5d in Unparse_ExprStmt::unparseExprStmt (this=0x1a1bf950, stmt=0x7fffda63ce30, info=...) at ../../../sourcetree/src/backend/unparser/CxxCodeGeneration/unparseCxx_statements.C:9889
(gdb) p SageInterface::printAST(stmt)
└──@0x7fffda63ce30 SgExprStatement transformation 0:0
└──@0x7fffd8488790 SgFunctionCallExp transformation 0:0
├──@0x7fffe6211910 SgMemberFunctionRefExp transformation 0:0
└──@0x7fffd7f2c370 SgExprListExp transformation 0:0
└──@0x7fffd8488720 SgFunctionCallExp transformation 0:0
├──@0x7fffe6211988 SgMemberFunctionRefExp transformation 0:0
└──@0x7fffd7f2c3d8 SgExprListExp transformation 0:0
$2 = void
(gdb) up 10
#48 0x00007ffff40dce69 in Unparser::unparseFile (this=0x7fffffff8c60, file=0x7fffeb786010, info=..., unparseScope=0x0) at ../../../sourcetree/src/backend/unparser/unparser.C:945
(gdb) p SageInterface::printAST2TextFile(file,"test.txt")
示例命令列用法
textASTGenerator -c test_qualifiedName.cpp
cat test_qualifiedName.cpp.AST.txt
└──@0x7fe9f1916010 SgProject
└──@0xb45730 SgFileList
└──@0x7fe9f17be010 SgSourceFile
├──@0x7fe9fdf19120 SgGlobal test_qualifiedName.cpp 0:0
│ ├──@0x7fe9f159a010 SgTypedefDeclaration rose_edg_required_macros_and_functions.h 0:0
│ │ └── NULL
│ ├──@0x7fe9f159a390 SgTypedefDeclaration rose_edg_required_macros_and_functions.h 0:0
│ │ └── NULL
│ ├──@0x7fe9f0f59010 SgFunctionDeclaration rose_edg_required_macros_and_functions.h 0:0 "::feclearexcept"
│ │ ├──@0x7fe9f1391010 SgFunctionParameterList rose_edg_required_macros_and_functions.h 0:0
│ │ │ └──@0x7fe9f1258010 SgInitializedName rose_edg_required_macros_and_functions.h 0:0 "::__excepts"
│ │ │ └── NULL
│ │ ├── NULL
│ │ └── NULL
│ ├──@0x7fe9f0f59540 SgFunctionDeclaration rose_edg_required_macros_and_functions.h 0:0 "::fegetexceptflag"
│ │ ├──@0x7fe9f1391630 SgFunctionParameterList rose_edg_required_macros_and_functions.h 0:0
│ │ │ ├──@0x7fe9f1258420 SgInitializedName rose_edg_required_macros_and_functions.h 0:0 "::__flagp"
│ │ │ │ └── NULL
│ │ │ └──@0x7fe9f1258628 SgInitializedName rose_edg_required_macros_and_functions.h 0:0 "::__excepts"
│ │ │ └── NULL
│ │ ├── NULL
│ │ └── NULL
...
│ └──@0x7fe9eff218c0 SgFunctionDeclaration test_qualifiedName.cpp 14:1 "::foo"
│ ├──@0x7fe9ef5e0320 SgFunctionParameterList test_qualifiedName.cpp 14:1
│ │ ├──@0x7fe9ef495278 SgInitializedName test_qualifiedName.cpp 14:13 "x"
│ │ │ └── NULL
│ │ └──@0x7fe9ef495480 SgInitializedName test_qualifiedName.cpp 14:20 "y"
│ │ └── NULL
│ ├── NULL
│ └──@0x7fe9ee8f3010 SgFunctionDefinition test_qualifiedName.cpp 15:1
│ └──@0x7fe9ee988010 SgBasicBlock test_qualifiedName.cpp 15:1
│ ├──@0x7fe9eee1ba90 SgVariableDeclaration test_qualifiedName.cpp 16:3
│ │ ├── NULL
│ │ └──@0x7fe9ef495688 SgInitializedName test_qualifiedName.cpp 16:3 "z"
│ │ └── NULL
│ ├──@0x7fe9ee7ad010 SgExprStatement test_qualifiedName.cpp 17:3
│ │ └──@0x7fe9ee7dc010 SgAssignOp test_qualifiedName.cpp 17:5
│ │ ├──@0x7fe9ee8c0010 SgVarRefExp test_qualifiedName.cpp 17:3
│ │ └──@0x7fe9ee813010 SgAddOp test_qualifiedName.cpp 17:9
│ │ ├──@0x7fe9ee8c0078 SgVarRefExp test_qualifiedName.cpp 17:7
│ │ └──@0x7fe9ee84a010 SgMultiplyOp test_qualifiedName.cpp 17:12
│ │ ├──@0x7fe9ee8c00e0 SgVarRefExp test_qualifiedName.cpp 17:11
│ │ └──@0x7fe9ee881010 SgIntVal test_qualifiedName.cpp 17:13
│ └──@0x7fe9ee77e010 SgReturnStmt test_qualifiedName.cpp 18:3
│ └──@0x7fe9ee8c0148 SgVarRefExp test_qualifiedName.cpp 18:10
├── NULL
├── NULL
└── NULL
儲存庫 errington1/ast-to-html 包含一個工具,用於將 Rose 抽象語法“圖形”呈現為可摺疊的 HTML,其中共享節點和迴圈由 HTML 連結表示。目前,它只能從命令列使用。計劃是新增命令列選項以省略樹的一部分,並將該工具作為庫提供。目前,它有點任意地省略了源自檔案 rose_edg_required_macros_and_functions.h 的樹的部分。
命令
astToHTML file.C
將生成 file.C.html,可以用瀏覽器檢視
firefox file.C.html
我們提供了一套用於 AST 的健全性檢查。我們使用它們來確保 AST 的一致性。強烈建議 ROSE 開發人員在完成 AST 轉換後新增健全性檢查。這比僅僅將程式碼正確地反解析為可編譯程式碼具有更高的標準。AST 可能會正確地反解析,但在健全性檢查中失敗是很常見的。
推薦的健全性檢查是
- 來自 src/midend/astDiagnostics 的 AstTests::runAllTests(project)。在內部,它呼叫以下檢查
- TestAstForProperlyMangledNames
- TestAstCompilerGeneratedNodes
- AstTextAttributesHandling
- AstCycleTest
- TestAstTemplateProperties
- TestAstForProperlySetDefiningAndNondefiningDeclarations
- TestAstSymbolTables
- TestAstAccessToDeclarations
- TestExpressionTypes
- TestMangledNames::test()
- TestParentPointersInMemoryPool::test()
- TestChildPointersInMemoryPool::test()
- TestMappingOfDeclarationsInMemoryPoolToSymbols::test()
- TestLValueExpressions
- TestMultiFileConsistancy::test() //2009
- TestAstAccessToDeclarations::test(*i); // 命名型別測試
還有一些其他的函式散落在周圍。但它們應該合併到 AstTests::runAllTests(project) 中。
- FixSgProject(*project); // 在 Qing 的 AST 介面中
- Utility::sanityCheck(SgProject*)
- Utility::consistencyCheck(SgProject*) // SgFile*
只需呼叫:SgNode::unparseToString()。您可以從 AST 中的任何 SgLocatedNode 呼叫它來轉儲部分 AST 的文字格式。
SageInterface 函式
//! Pretty print AST horizontally, output to std output void SageInterface::printAST (SgNode* node); //! Pretty print AST horizontally, output to a specified text file. void SageInterface::printAST2TextFile (SgNode* node, const char* filename);
一個翻譯器 (textASTGenerator) 也可用,其原始碼位於 exampleTranslators/defaultTranslator 下。
在 gdb 中的示例用法
- 將 AST 的一部分列印到螢幕上
- 將 AST 的一部分列印到文字檔案中
(gdb) up
#7 0x00007ffff418ab5d in Unparse_ExprStmt::unparseExprStmt (this=0x1a1bf950, stmt=0x7fffda63ce30, info=...) at ../../../sourcetree/src/backend/unparser/CxxCodeGeneration/unparseCxx_statements.C:9889
(gdb) p SageInterface::printAST(stmt)
└──@0x7fffda63ce30 SgExprStatement transformation 0:0
└──@0x7fffd8488790 SgFunctionCallExp transformation 0:0
├──@0x7fffe6211910 SgMemberFunctionRefExp transformation 0:0
└──@0x7fffd7f2c370 SgExprListExp transformation 0:0
└──@0x7fffd8488720 SgFunctionCallExp transformation 0:0
├──@0x7fffe6211988 SgMemberFunctionRefExp transformation 0:0
└──@0x7fffd7f2c3d8 SgExprListExp transformation 0:0
$2 = void
(gdb) up 10
#48 0x00007ffff40dce69 in Unparser::unparseFile (this=0x7fffffff8c60, file=0x7fffeb786010, info=..., unparseScope=0x0) at ../../../sourcetree/src/backend/unparser/unparser.C:945
(gdb) p SageInterface::printAST2TextFile(file,"test.txt")
示例命令列用法
textASTGenerator -c test_qualifiedName.cpp
cat test_qualifiedName.cpp.AST.txt
└──@0x7fe9f1916010 SgProject
└──@0xb45730 SgFileList
└──@0x7fe9f17be010 SgSourceFile
├──@0x7fe9fdf19120 SgGlobal test_qualifiedName.cpp 0:0
│ ├──@0x7fe9f159a010 SgTypedefDeclaration rose_edg_required_macros_and_functions.h 0:0
│ │ └── NULL
│ ├──@0x7fe9f159a390 SgTypedefDeclaration rose_edg_required_macros_and_functions.h 0:0
│ │ └── NULL
│ ├──@0x7fe9f0f59010 SgFunctionDeclaration rose_edg_required_macros_and_functions.h 0:0 "::feclearexcept"
│ │ ├──@0x7fe9f1391010 SgFunctionParameterList rose_edg_required_macros_and_functions.h 0:0
│ │ │ └──@0x7fe9f1258010 SgInitializedName rose_edg_required_macros_and_functions.h 0:0 "::__excepts"
│ │ │ └── NULL
│ │ ├── NULL
│ │ └── NULL
│ ├──@0x7fe9f0f59540 SgFunctionDeclaration rose_edg_required_macros_and_functions.h 0:0 "::fegetexceptflag"
│ │ ├──@0x7fe9f1391630 SgFunctionParameterList rose_edg_required_macros_and_functions.h 0:0
│ │ │ ├──@0x7fe9f1258420 SgInitializedName rose_edg_required_macros_and_functions.h 0:0 "::__flagp"
│ │ │ │ └── NULL
│ │ │ └──@0x7fe9f1258628 SgInitializedName rose_edg_required_macros_and_functions.h 0:0 "::__excepts"
│ │ │ └── NULL
│ │ ├── NULL
│ │ └── NULL
...
│ └──@0x7fe9eff218c0 SgFunctionDeclaration test_qualifiedName.cpp 14:1 "::foo"
│ ├──@0x7fe9ef5e0320 SgFunctionParameterList test_qualifiedName.cpp 14:1
│ │ ├──@0x7fe9ef495278 SgInitializedName test_qualifiedName.cpp 14:13 "x"
│ │ │ └── NULL
│ │ └──@0x7fe9ef495480 SgInitializedName test_qualifiedName.cpp 14:20 "y"
│ │ └── NULL
│ ├── NULL
│ └──@0x7fe9ee8f3010 SgFunctionDefinition test_qualifiedName.cpp 15:1
│ └──@0x7fe9ee988010 SgBasicBlock test_qualifiedName.cpp 15:1
│ ├──@0x7fe9eee1ba90 SgVariableDeclaration test_qualifiedName.cpp 16:3
│ │ ├── NULL
│ │ └──@0x7fe9ef495688 SgInitializedName test_qualifiedName.cpp 16:3 "z"
│ │ └── NULL
│ ├──@0x7fe9ee7ad010 SgExprStatement test_qualifiedName.cpp 17:3
│ │ └──@0x7fe9ee7dc010 SgAssignOp test_qualifiedName.cpp 17:5
│ │ ├──@0x7fe9ee8c0010 SgVarRefExp test_qualifiedName.cpp 17:3
│ │ └──@0x7fe9ee813010 SgAddOp test_qualifiedName.cpp 17:9
│ │ ├──@0x7fe9ee8c0078 SgVarRefExp test_qualifiedName.cpp 17:7
│ │ └──@0x7fe9ee84a010 SgMultiplyOp test_qualifiedName.cpp 17:12
│ │ ├──@0x7fe9ee8c00e0 SgVarRefExp test_qualifiedName.cpp 17:11
│ │ └──@0x7fe9ee881010 SgIntVal test_qualifiedName.cpp 17:13
│ └──@0x7fe9ee77e010 SgReturnStmt test_qualifiedName.cpp 18:3
│ └──@0x7fe9ee8c0148 SgVarRefExp test_qualifiedName.cpp 18:10
├── NULL
├── NULL
└── NULL
1) 迭代器類:迭代器遵循 STL 迭代器模式,並實現為先序遍歷,並維護自己的堆疊。迭代器執行與 ROSE 中的遍歷類完全相同的遍歷(它使用相同的基礎資訊)
#include "RoseAst.h"
SgNode* node= .... // any subtree
RoseAst ast(node);
for(RoseAst::iterator i=ast.begin();i!=ast.end();++i) {
cout<<"We are here:"<<(*i)->class_name()<<endl;
}
更多功能
- 預設情況下,它不遍歷空指標(您不會看到它們)。但是,如果您想檢視和遍歷所有空指標,您可以使用以下函式:ast.begin().withNullValues()
- 它還有一個功能,可以在遍歷期間排除子樹:您只需在*迭代器*上呼叫
- i.skipChildrenOnForward(); ++i; // 跳過當前節點的子節點,並轉到遍歷中所有這些子節點之後緊隨其後的下一個節點
相關原始檔
- https://github.com/rose-compiler/rose-develop/blob/master/src/midend/astMatching/RoseAst.h
- https://github.com/rose-compiler/rose-develop/blob/master/src/midend/astMatching/RoseAst.C
一些有用的成員函式
- get_base_type():某些從 SgType 派生的 IR 節點上的成員函式,並返回型別定義、引用、指標、陣列、修飾符等下非遞迴剝離(直接)的型別。
- findBaseType() 遞迴地剝離所有
typedefs, SgTypedefType
reference, SgReferenceType
pointers, SgPointerType
arrays, SgArrayType
modifiers SgModifierType
- SgType * stripType (unsigned char bit_array=STRIP_MODIFIER_TYPE|STRIP_REFERENCE_TYPE|STRIP_POINTER_TYPE|STRIP_ARRAY_TYPE|STRIP_TYPEDEF_TYPE) const
返回型別定義、指標、引用、修飾符、陣列表示等層級之下的隱藏型別。
- SgType * stripTypedefsAndModifiers () const
所有具有檔案位置資訊的 AST 節點都派生自 SgLocatedNode,它具有開始和結束 Sg_File_Info 來指示開始和結束位置資訊。
您可以透過呼叫以下方法獲取和列印位置資訊對
locatedNode->get_startOfConstruct()->display() ; locatedNode->get_endOfConstruct()->display() ; // get beginning info only locatedNode->get_file_info()->display() ;
display() 的輸出可能如下所示
Inside of Sg_File_Info::display(debug.......)
isTransformation = false
isCompilerGenerated = true (no position information)
isOutputInCodeGeneration = false
isShared = false
isFrontendSpecific = true (part of ROSE support for gnu compatability)
isSourcePositionUnavailableInFrontend = false
isCommentOrDirective = false
isToken = false
file_id = 2
filename = /home/liao6/daily-test-rose/upcwork/install/include/gcc_HEADERS/rose_edg_required_macros_and_functions.h
line = 167 column = 1
.... // transformation generated, will be outputted by the unparser
upcr_pshared_ptr_t gsj;
Inside of Sg_File_Info::display(debug.......)
isTransformation = true (part of a transformation)
isCompilerGenerated = false
isOutputInCodeGeneration = true (output in code generator)
isShared = false
isFrontendSpecific = false
isSourcePositionUnavailableInFrontend = false
isCommentOrDirective = false
isToken = false
file_id = -3
filename = transformation
line = 0 column = 0
如您所見,有一些 AST 節點是由 ROSE 的前端或轉換器生成的。轉換生成的位於節點可能沒有行號或列號。
您可以獲取檔名、行號、列號
SgLocatedNode* node = .... ; Sg_File_Info* info_start = node->get_startOfConstruct (); size_t a_start = (size_t)info_start->get_line (); string filename = node->get_file_info()->get_filename(); Sg_File_Info* info_end = node->get_endOfConstruct (); size_t a_end = (info_end == NULL) ? a_start : info_end->get_line ();
請參閱 ROSE 編譯器框架/預處理資訊 中的更多資訊
除了節點和邊之外,ROSE AST 還可以具有附加於節點和邊的屬性,這些屬性附加用於預處理資訊,例如 #include 或 #if .. #else。它們附加在附近 AST 節點之前、之後或內部(僅具有源位置資訊的節點)。
一個示例轉換器將遍歷輸入程式碼的 AST 並轉儲資訊,其中可能包括預處理資訊。
例如
exampleTranslators/defaultTranslator/preprocessingInfoDumper -c main.cxx ----------------------------------------------- Found an IR node with preprocessing Info attached: (memory address: 0x2b7e1852c7d0 Sage type: SgFunctionDeclaration) in file /export/tmp.liao6/workspace/userSupport/main.cxx (line 3 column 1) -------------PreprocessingInfo #0 ----------- : classification = CpreprocessorIncludeDeclaration: String format = #include "all_headers.h" relative position is = before
來源: http://www.rosecompiler.org/ROSE_Tutorial/ROSE-Tutorial.pdf(第 29 章 - 處理註釋、預處理器指令以及向生成的程式碼中新增任意文字)
SageBuilder 和 SageInterface 名稱空間提供用於建立 AST 並對其進行操作的函式。Doxygen 文件