65.9K
CodeProject 正在变化。 阅读更多。
Home

C# CodeDOM解析器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (12投票s)

2002年6月28日

6分钟阅读

viewsIcon

253916

downloadIcon

4323

这是一个解析 C# 源代码并创建代码的 CODEDOM 树的实用程序。

引言

CS CODEDOM Parser 是一个实用程序,它解析 C# 源代码并创建代码的 CODEDOM 树(代表代码的通用类,是 .NET Framework 的一部分 - 命名空间 System.CodeDom)。

当前版本 (0.1) 功能有限 - 它只解析到类型成员及其参数,对表达式的支持非常有限,并且不解析成员内的语句。目前我停留在这一级别主要有两个原因:

  • 第一 - 它足以满足我的需求(我需要进行一些代码分析来强制执行编码标准)。
  • 第二 - CODEDOM 是有限的,无法完全表达 C# 代码 - 有关更多详细信息,请参阅下面的 CODEDOM 限制 部分。

另一方面,它也解析源代码注释,因此可用于分析代码和注释之间的相互依赖关系。

此外,此版本的稳定性较低 - 它是某种 alpha 版本。如果有人想帮助进一步推进此项目,欢迎您的参与。

该解析器基于 Mono - CSharp Compiler 代码。我一直在寻找可用的 C# 解析器和 C# 解析器构建工具(我需要 C# 语言编写的 C# 解析器),最终选择了 Mono。有关利用 Mono 解析器和其他探索过的可能性的更多详细信息,请参阅 C# 解析器工具 部分。

CODEDOM 限制

起初,我认为使用与语言无关的语法树是个好主意,CodeDom 看起来不错。如果某个代码分析工具基于它构建,那么它可以适用于任何 .NET 语言。只需更改解析器,其余的都一样,听起来很酷。但是,当我深入研究 CodeDom 时,我发现许多语言特性(不仅仅是 C#,基本上适用于任何语言)缺失,并且无法完全解析源代码。主要问题在于表达式和语句,其中 CodeDom 的类非常有限 - 例如,不支持一元运算符以及更多问题。

尽管存在局限性,我还是决定继续使用 CodeDom,因为它足以满足分析代码以实现编码标准的目的(至少满足我现在需要的功能 - 它还可以将注释和代码保留在同一个树中,这是我喜欢的一点),但这仍然是未来开发的一个开放性问题。

以下是我发现的一些问题(还有更多,)

  • CodeCompileUnit 没有用于 using 指令或 ns 成员的空间,因此它们现在被放置在第一个默认的 NS 中。
  • using_alias_directive - 未找到支持。
  • 嵌套命名空间 - 未找到支持(因此解析器将命名空间层次结构扁平化)。
  • 变量声明列表(int i,j,k;) - 不支持 - 已转换为单个变量声明。
  • pointer_type - 未找到支持。
  • "jagged" 数组类型(数组的数组) - MS CSharpCodeProvider 反转了维的顺序。
  • params 关键字 - 不支持 - 参数在解析时被省略,然后该参数被视为普通的数组类型参数。
  • 嵌套委托上的 private 修饰符未被 CSharpCodeProvider 显示(所有其他嵌套类型都可以正常工作)。
  • unsafe 修饰符 - 未找到支持。
  • readonly 修饰符 - 未找到支持。
  • volatile 修饰符 - 未找到支持。
  • 显式接口实现 - 尚未实现(我认为这可以实现)。
  • 事件的 add 和 remove 访问器 - 未找到支持。
  • virtual 和 override 修饰符在 MS CSharpCodeProvider 中对事件不起作用。
  • 运算符成员和析构函数 - 未找到支持。
  • 表达式 - 完全没有一元表达式(运算符)!!!,只有一维数组,一些运算符不支持等等。
  • Attribute targets : 未找到支持。
  • Attributes on accessor : 未找到支持。
  • 如果 CompileUnit 在全局范围内包含自定义属性,CSSharpCodeProvider 会将它们打印在全局 using 指令之前(这是因为 using 必须在第一个 ns 中)。

C# 解析器工具

我想使用一些现有的工具,所以我四处查看,发现了一些有趣的东西。

  • Mono 项目
    他们正在实现一个完整的开源 .NET 平台(他们修改了 jay 解析器生成器并用它来生成解析器)。
  • Compiler Writing Tools using C#, 来自佩斯利大学的 Malcolm Crowe
    Crowe 先生用 C# 创建了解析器和词法分析器生成器。我玩了很久这些工具,但是当我想要做一些更复杂的事情时,我卡住了。

  • C# grammar for flex/bison,由爱尔兰国立大学的 James Power 编写
    包含用于著名的 bison 和 flex 工具的脚本,这些工具可以生成 C 解析器。我曾认为我可以在这些工具的某个 C# 移植中使用它们,但我做不到,所以最终使用了 Mono 中的语法。

  • jb2csharp
    这是 JB Parser and Lexer Generation for Java 的移植(它本身是 bison 和 flex 的移植)。但当前版本是 alpha 版本,我甚至无法让他们的计算器示例(作者声称其工作正常)运行。

  • CsLex,来自 Brad Merrill
    这是一个词法分析器生成器。

  • 我还查看了 MS Rotor 项目,其中的 C# 解析器是用 C++ 编写的(并且不是开源许可证)。

因此,我最终决定使用 Mono 源代码,我使用了他们的词法分析器、jay 以及他们的 jay 语法来生成我的解析器。我使用 jay 语法和我的代码来创建 CodeDom 对象。

软件包描述

CS CODEDOM Parser 软件包包含:

  • CodeDom 解析器本身(/ 目录)
  • 解析器的 NUnit 测试(/NUnitTests 目录)
    包含一系列我用来检查解析器功能的测试 - 如果您想运行它们,应该安装 NUnit
  • testParser(/testParser 目录)
    一个简单的命令行实用程序,用于测试解析器 - 它解析文件(文件名作为命令行参数提供),并将 CSharpCodeProvider(CodeDom 中的类)生成的代码输出到标准输出。
  • CodeTreeView(/CodeTreeView 目录)
    一个简单的 Windows 应用程序,它打开文件并在左侧(treeview 控件)显示 CODEDOM 树,在右侧(textbox 控件)显示原始源代码。当您单击树节点时,文本框会滚动以显示代码。它有点像一个非常非常简单的源代码查看器。

Licence

CS CODEDOM Parser 和此软件包中包含的工具根据 GPL 许可证 分发。

最新版本

您可以在 http://ivanz.webpark.cz/csparser.html 上查找最新版本。

未来

未来开发的基本思路是扩展 CodeDom 以支持所有语言特性,从而可以完全解析源代码。(另一种选择是放弃 CodeDom 并拥有自己的语法树,但我仍然喜欢与语言无关的树结构的想法,它可用于不同的任务)。

应改进错误和警告的报告(统一代码和消息,统一错误报告,Report 类应存储报告的错误)。

解析器还应得到改进,以更精确地指示源代码中语法元素的位置。

还需要更好地分离解析器和 CODEDOM 构建器。

如果有人喜欢这个工具并希望帮助其改进,欢迎您。

© . All rights reserved.