构建基于 CDT 的编辑器,第 3 部分: 基本的 CDT 解析
2009-12-19 00:00:00 来源:WEB开发网更新 BBCDT
如果在 Eclipse 中打开 BBCDT 项目,会发现还有更多代码,特别是在 org.dworks.bbcdt.core 插件项目中。这些新类中的许多类都是设置及执行解析所必需的,但它们中的大多数代表了 C/C++ 源文件或 C/C++ AST 的元素。
org.dworks.bbcdt.ui 插件也有新类。它们大多数都处理协调过程,但 org.dworks.bbcdt.ui.action 包中的 ASTAction 类却实现 IEditorActionDelegate 接口。该类在 BBCDT 编辑器可视时出现。当单击工具条 “contribution”,该类访问 IASTCompilationUnit 并在其声明的对象间迭代。如果它们中的任何一个声明了函数或变量,或者以 namespace、using 或 extern 开头,ASTAction 就会显示一个窗口,该窗口列出了每一个声明的类型以及该声明类型的特定信息。清单 1 显示了所需的代码。
清单 1. 访问 CDT AST 中的声明IASTCompilationUnit unit = CCorePlugin.getCompilationUnit();
Iterator iter = unit.getDeclarations();
while(iter.hasNext()) {
IASTDeclaration decl = (IASTDeclaration)iter.next();
if (decl instanceof IASTFunction)
output += "Function declaration: " +
((IASTFunction)decl).getName();
else if (decl instanceof IASTLinkageSpecification)
output += "Linkage declaration: " +
((IASTLinkageSpecification)decl).getLinkageString();
else if (decl instanceof IASTNamespaceDefinition)
output += "Namespace definition: " +
((IASTNamespaceDefinition)decl).getName();
else if (decl instanceof IASTUsingDeclaration)
output += "Using declaration: " +
((IASTUsingDeclaration)decl).getName();
else if (decl instanceof IASTVariable)
output += "Variable declaration: " +
((IASTVariable)decl).getName();
在 CDT 中找不到此代码;我将它们修补到一块,以使访问并遍历 IASTCompilationUnit 变得简单。通过修改 ASTAction,您能够在节点间进行搜索并创建整个树。图 2 显示了在单击 ASTAction 按钮后 BBCDT 的输出。
图 2. BBCDT AST 分析的输出
查看原图(大图)
结束语
本文先是解释了 CDT Parser 如何对编辑器文本的改变做出响应,然后用 C/C++ 元素创建了 AST。本文还对解析理论进行了总结。
本文所描述的 Parser 实现了其目标,但它也有缺点。它很慢,其分析只局限于一次一个源文件。在本系列的第 4 部分中将会介绍 CDT 中的另一个更为强大也更为复杂的解析器。
本文源代码下载地址: http://flashview.ddvip.com/2009_12/os-ecl-cdt3-BBCDT_Plugins.rar
- ››基于IP地址的vsftp服务器
- ››构建Windows 8风格应用23-App Bar概述及使用规范
- ››基于MySQL 水平分区的优化示例
- ››基于CentOS5的Linux下pptp和openvpn的搭建及配置
- ››构建域名服务器(DNS)
- ››基于JavaScript的网页版塔防游戏
- ››基于Android平台 QQ大战360手机游戏爆红
- ››构建Android平台Google Map应用
- ››基于Windows Azure的云计算应用设计
- ››构建WinForm 通用速选(全选、反选、清空)组件
- ››基于AES算法实现对数据的加密
- ››基于SoPC目标板Flash编程设计的创建及应用
更多精彩
赞助商链接