C#到XML或前缀表示法

C#到XML或前缀表示法,c#,compiler-construction,programming-languages,export-to-xml,C#,Compiler Construction,Programming Languages,Export To Xml,也许这是滑雪梦/问题中的馅饼。有谁知道有一种工具可以生成XML或前缀符号(lispy)——其中包括来自C源代码的文档注释?这似乎对许多文档生成器、静态分析工具或其他工具都很有用 诚然,这是一种中间件工具,可能可以通过Antlr之类的编译器生成器来完成。然而,有人可能已经搔痒,并产生了一些沿着这些路线。。。嗯? 编辑:要澄清: “其中包括来自C#源代码的文档注释” 我添加这一点是为了区分AST可能不包含注释(尽管Antlr有一个“通道”概念,可以流式处理注释) 编辑:要提取的内容: 基本上是AST

也许这是滑雪梦/问题中的馅饼。有谁知道有一种工具可以生成XML或前缀符号(lispy)——其中包括来自C源代码的文档注释?这似乎对许多文档生成器、静态分析工具或其他工具都很有用

诚然,这是一种中间件工具,可能可以通过Antlr之类的编译器生成器来完成。然而,有人可能已经搔痒,并产生了一些沿着这些路线。。。嗯?

编辑:要澄清: “其中包括来自C#源代码的文档注释”

我添加这一点是为了区分AST可能不包含注释(尽管Antlr有一个“通道”概念,可以流式处理注释)

编辑:要提取的内容: 基本上是AST,带有注释,但是可以采用可重用的形式,即Lispy或XML。但它必须是完整的,这样,如果一个目的不需要信息,另一个过程仍然可以从中受益

希望有帮助


L-

我所知道的最接近的事情是。它使用XML作为中间输出,并使用XSLT对其进行处理,以在托管程序集上创建HTML样式的文档。只从中获取XML数据应该很容易。

好的,现在更清楚的是,您想要一个完整的AST,MS的标准工具中还没有任何内容。然而,C#编译器团队目前正在开发“Roslyn”又名“编译器即服务”。预览版本很快就要到期了——在这一点上,它是否支持您所追求的应该变得更加清晰

目前还不清楚Roslyn是否会作为.NET框架的一部分提供,或者它是否只会与Visual Studio的一些SKU一起提供,但它最终可能比其他一些替代品更便宜


原始答案

这已经是语言和普通工具的一部分了-在VisualStudio中,只需转到项目属性/Build/Output并启用带有“XML文档文件”的复选框。选择要写入文档的文件,然后离开

从中构建可读的HTML稍微复杂一些;将这样做,但需要一个助手项目-将其转化为更易于管理的任务。不过,它在生成内容方面相当灵活——例如,您可以查看使用Sandcastle生成的


此外,如果您正在构建一个供其他人使用的类库,如果您将XML与DLL一起提供,并且它具有相同的名称(只是带有一个.XML后缀而不是.DLL),Visual Studio将使用它在用户使用您的类型、方法等时向他们提供工具提示。

这是很久以前就已经解决的问题

我们的源代码到源代码的程序转换工具,可以对许多语言进行转换,包括使用DMS的C#

请参见下面的示例,在该示例中,DMS将源代码解析为一个AST,并使用(前后)注释装饰各个AST节点,然后以“Lispy”语法转储到输出流中。还有一个简单的XML变体,只是为了满足那些必须使用XML的人

作为一般规则,DMS用户只使用它来查看解析树,因为DMS提供了大量用于分析、转换和预打印(从AST中重新生成文本,包括注释)的机制

使用DMS遍历AST并只挑选那些满足您希望的任何标准的注释(包括“看起来像文档注释”)是非常简单的。更重要的是,您还可以获得精确的源位置信息,以及对附加注释的树的访问;您可以轻松地从方法头子树构建方法摘要

大多数DMS用户想要做更复杂的事情,我们声称,在DMS中使用DMS提供的所有机制比导出到XML或Lisp格式的特定工具要容易得多,在这些工具中,您必须重新发明所有这些机制

对于此代码:

/* MyClass source file
   Contains MyClass and its methods
*/
class MyClass {

   static int count; // counts number of class instances

   MyClass() { count++; // bump instance count
     }

   /* First Method */
   get_count() { return count; }

}
DMS的C#解析器生成此输出(注意嵌入的注释):


如果您可以进行这样的源到源转换,那么您已经有了一个解析器和一个AST。为什么不在你打算作为消费者使用的工具中使用它,而不是让它们进行这样的表示呢?你能澄清你想要提取什么信息吗?也许可以通过提供一个简单的输入和输出示例?这似乎只提取文档/注释。似乎OP正在考虑导出整个源代码的表示形式(参见静态分析工具的参考)。@delnan:如果是这样的话,这是一个措辞非常糟糕的问题:“包括来自C#源代码的文档注释”对我来说听起来像XML注释。即使这样的事情确实存在,我认为坚持使用XML文档也更有意义。好吧,我假设“包含”不是为了见鬼,而是意味着结果应该包含更多的“来自C#源代码的文档注释”。但老实说,我也不会打赌。是的,这个问题不是很清楚,希望OP可以澄清。添加了一些澄清注释。@lucidquiet:除了C#的XML文档注释之外,您还不清楚想要什么。这些是开发人员决定应作为文档的注释。诸如“必须解决我调用的方法中的错误…”之类的注释确实不属于该代码的文档,真是太棒了。现在,如果可能的话,我对JavaScript和C#的ASTs很感兴趣。您拥有的众多工具中,有哪一个可以实现上述示例?它可以从命令行运行吗?我不想写特别的工具,但事实是,我通常希望在构建管道中放一些东西,如果这个工具不是一个大型IDE或其他东西,它会工作得更好。DMS生成的工具基本上是命令行驱动的,因为大多数使用,甚至是你的,都倾向于作为p
Domain Parser for CSharp~CSharp4_0 2.3.3
Copyright (C) Semantic Designs 1996-2010; All Rights Reserved
Parsing Time: 0.001728 seconds
(compilation_unit@CSharp~CSharp4_0=1#58e66c0^0 Line 4 Column 1 File C:/temp/test.cs
 (extern_alias_directives@CSharp~CSharp4_0=2#58e3340 Line 4 Column 1 File C:/temp/test.cs)extern_alias_directives
 (using_directives@CSharp~CSharp4_0=493#58e3380 Line 4 Column 1 File C:/temp/test.cs)using_directives
 (global_attributes@CSharp~CSharp4_0=1008#58e33c0 Line 4 Column 1 File C:/temp/test.cs)global_attributes
 (namespace_member_declarations@CSharp~CSharp4_0=506#58e6440 Line 4 Column 1 File C:/temp/test.cs
  (namespace_member_declarations@CSharp~CSharp4_0=505#58e3400 Line 4 Column 1 File C:/temp/test.cs)namespace_member_declarations
  (namespace_member_declaration@CSharp~CSharp4_0=516#58e3dc0 Line 4 Column 1 File C:/temp/test.cs
   (class_declaration@CSharp~CSharp4_0=533#58e6280 Line 4 Column 1 File C:/temp/test.cs
   |(class_header@CSharp~CSharp4_0=526#58e3600 Line 4 Column 1 File C:/temp/test.cs
   | precomment 4:1 `/* MyClass source file

   Contains MyClass and its methods

*/'
   | (attributes@CSharp~CSharp4_0=1023#58e3440 Line 4 Column 1 File C:/temp/test.cs)attributes
   | (class_modifiers@CSharp~CSharp4_0=534#58e3480 Line 4 Column 1 File C:/temp/test.cs)class_modifiers
   | (optional_partial@CSharp~CSharp4_0=524#58e34c0 Line 4 Column 1 File C:/temp/test.cs)optional_partial
   | (identifier@CSharp~CSharp4_0=1106#58e3580 Line 4 Column 7 File C:/temp/test.cs
   |  (IDENTIFIER@CSharp~CSharp4_0=1171#58e3500[`MyClass'] Line 4 Column 7 File C:/temp/test.cs)IDENTIFIER
   | )identifier
   | (class_base@CSharp~CSharp4_0=552#58e35c0 Line 4 Column 15 File C:/temp/test.cs)class_base
   |)class_header
   |(class_member_declarations@CSharp~CSharp4_0=563#58e3c80 {3} Line 6 Column 4 File C:/temp/test.cs
   | (class_member_declaration@CSharp~CSharp4_0=573#58e3ce0 Line 6 Column 4 File C:/temp/test.cs
   |  (field_declaration@CSharp~CSharp4_0=591#58e3e00 Line 6 Column 4 File C:/temp/test.cs
   |   postcomment 5:1 `// counts number of class instances'
   |   (attributes@CSharp~CSharp4_0=1023#58e3300 Line 6 Column 4 File C:/temp/test.cs)attributes
   |   (field_modifiers@CSharp~CSharp4_0=593#58e3aa0 {1} Line 6 Column 4 File C:/temp/test.cs
   |   |(field_modifier@CSharp~CSharp4_0=607#58e3840 Line 6 Column 4 File C:/temp/test.cs)field_modifier
   |   )field_modifiers
   |   (integral_type@CSharp~CSharp4_0=42#58e3540 Line 6 Column 11 File C:/temp/test.cs)integral_type
   |   (variable_declarators@CSharp~CSharp4_0=104#58e3780 Line 6 Column 15 File C:/temp/test.cs
   |   |(variable_declarator@CSharp~CSharp4_0=112#58e38a0 Line 6 Column 15 File C:/temp/test.cs
   |   | (identifier@CSharp~CSharp4_0=1106#58e3d00 Line 6 Column 15 File C:/temp/test.cs
   |   |  (IDENTIFIER@CSharp~CSharp4_0=1171#58e3460[`count'] Line 6 Column 15 File C:/temp/test.cs)IDENTIFIER
   |   | )identifier
   |   |)variable_declarator
   |   )variable_declarators
   |  )field_declaration
   | )class_member_declaration
   | (class_member_declaration@CSharp~CSharp4_0=579#58e6580 Line 8 Column 4 File C:/temp/test.cs
   |  (constructor_declaration@CSharp~CSharp4_0=798#58e61a0 Line 8 Column 4 File C:/temp/test.cs
   |   (constructor_header@CSharp~CSharp4_0=792#58e6720 Line 8 Column 4 File C:/temp/test.cs
   |   |(attributes@CSharp~CSharp4_0=1023#58e38c0 Line 8 Column 4 File C:/temp/test.cs)attributes
   |   |(constructor_modifiers@CSharp~CSharp4_0=800#58e3b40 Line 8 Column 4 File C:/temp/test.cs)constructor_modifiers
   |   |(constructor_declarator@CSharp~CSharp4_0=815#58e3760 Line 8 Column 4 File C:/temp/test.cs
   |   | (identifier@CSharp~CSharp4_0=1106#58e3d40 Line 8 Column 4 File C:/temp/test.cs
   |   |  (IDENTIFIER@CSharp~CSharp4_0=1171#58e3d80[`MyClass'] Line 8 Column 4 File C:/temp/test.cs)IDENTIFIER
   |   | )identifier
   |   | (optional_formal_parameter_list@CSharp~CSharp4_0=647#58e6700 Line 8 Column 12 File C:/temp/test.cs)optional_formal_parameter_list
   |   | (constructor_initializer@CSharp~CSharp4_0=816#58e37c0 Line 8 Column 14 File C:/temp/test.cs)constructor_initializer
   |   |)constructor_declarator
   |   )constructor_header
   |   (block@CSharp~CSharp4_0=405#58e6780 Line 8 Column 14 File C:/temp/test.cs
   |   |(statement_list@CSharp~CSharp4_0=406#58e3d20 Line 8 Column 16 File C:/temp/test.cs
   |   | (non_pp_embedded_statement@CSharp~CSharp4_0=367#58e39a0 Line 8 Column 16 File C:/temp/test.cs
   |   |  postcomment 2:1 `// bump instance count'
   |   |  (statement_expression@CSharp~CSharp4_0=433#58e6540 Line 8 Column 16 File C:/temp/test.cs
   |   |   (primary_no_array_creation_expression@CSharp~CSharp4_0=160#58e6740 Line 8 Column 16 File C:/temp/test.cs
   |   |   |(identifier@CSharp~CSharp4_0=1106#58e3800 Line 8 Column 16 File C:/temp/test.cs
   |   |   | (IDENTIFIER@CSharp~CSharp4_0=1171#58e3700[`count'] Line 8 Column 16 File C:/temp/test.cs)IDENTIFIER
   |   |   |)identifier
   |   |   )primary_no_array_creation_expression
   |   |  )statement_expression
   |   | )non_pp_embedded_statement
   |   |)statement_list
   |   )block
   |  )constructor_declaration
   | )class_member_declaration
   | (class_member_declaration@CSharp~CSharp4_0=579#58e6220 Line 12 Column 4 File C:/temp/test.cs
   |  (constructor_declaration@CSharp~CSharp4_0=798#58e3a80 Line 12 Column 4 File C:/temp/test.cs
   |   (constructor_header@CSharp~CSharp4_0=792#58e6380 Line 12 Column 4 File C:/temp/test.cs
   |   |(attributes@CSharp~CSharp4_0=1023#58e3a00 Line 12 Column 4 File C:/temp/test.cs)attributes
   |   |(constructor_modifiers@CSharp~CSharp4_0=800#58e38e0 Line 12 Column 4 File C:/temp/test.cs)constructor_modifiers
   |   |(constructor_declarator@CSharp~CSharp4_0=815#58e36e0 Line 12 Column 4 File C:/temp/test.cs
   |   | (identifier@CSharp~CSharp4_0=1106#58e3a20 Line 12 Column 4 File C:/temp/test.cs
   |   |  (IDENTIFIER@CSharp~CSharp4_0=1171#58e6760[`get_count'] Line 12 Column 4 File C:/temp/test.cs
   |   |   precomment 0:1 `/* First Method */')IDENTIFIER
   |   | )identifier
   |   | (optional_formal_parameter_list@CSharp~CSharp4_0=647#58e6960 Line 12 Column 14 File C:/temp/test.cs)optional_formal_parameter_list
   |   | (constructor_initializer@CSharp~CSharp4_0=816#58e65a0 Line 12 Column 16 File C:/temp/test.cs)constructor_initializer
   |   |)constructor_declarator
   |   )constructor_header
   |   (block@CSharp~CSharp4_0=405#58e6200 Line 12 Column 16 File C:/temp/test.cs
   |   |(statement_list@CSharp~CSharp4_0=406#58e6160 Line 12 Column 18 File C:/temp/test.cs
   |   | (non_pp_embedded_statement@CSharp~CSharp4_0=373#58e3e60 Line 12 Column 18 File C:/temp/test.cs
   |   |  (null_coalescing_expression@CSharp~CSharp4_0=327#58e3e40 Line 12 Column 25 File C:/temp/test.cs
   |   |   (conditional_or_expression@CSharp~CSharp4_0=325#58e3ec0 Line 12 Column 25 File C:/temp/test.cs
   |   |   |(conditional_and_expression@CSharp~CSharp4_0=323#58e6a00 Line 12 Column 25 File C:/temp/test.cs
   |   |   | (inclusive_or_expression@CSharp~CSharp4_0=321#58e3c00 Line 12 Column 25 File C:/temp/test.cs
   |   |   |  (exclusive_or_expression@CSharp~CSharp4_0=319#58e3b20 Line 12 Column 25 File C:/temp/test.cs
   |   |   |   (and_expression@CSharp~CSharp4_0=317#58e35a0 Line 12 Column 25 File C:/temp/test.cs
   |   |   |   |(equality_expression@CSharp~CSharp4_0=314#58e6520 Line 12 Column 25 File C:/temp/test.cs
   |   |   |   | (additive_expression@CSharp~CSharp4_0=300#58e6140 Line 12 Column 25 File C:/temp/test.cs
   |   |   |   |  (multiplicative_expression@CSharp~CSharp4_0=296#58e6460 Line 12 Column 25 File C:/temp/test.cs
   |   |   |   |   (primary_no_array_creation_expression@CSharp~CSharp4_0=160#58e63a0 Line 12 Column 25 File C:/temp/test.cs
   |   |   |   |   |(identifier@CSharp~CSharp4_0=1106#58e37e0 Line 12 Column 25 File C:/temp/test.cs
   |   |   |   |   | (IDENTIFIER@CSharp~CSharp4_0=1171#58e6560[`count'] Line 12 Column 25 File C:/temp/test.cs)IDENTIFIER
   |   |   |   |   |)identifier
   |   |   |   |   )primary_no_array_creation_expression
   |   |   |   |  )multiplicative_expression
   |   |   |   | )additive_expression
   |   |   |   |)equality_expression
   |   |   |   )and_expression
   |   |   |  )exclusive_or_expression
   |   |   | )inclusive_or_expression
   |   |   |)conditional_and_expression
   |   |   )conditional_or_expression
   |   |  )null_coalescing_expression
   |   | )non_pp_embedded_statement
   |   |)statement_list
   |   )block
   |  )constructor_declaration
   | )class_member_declaration
   |)class_member_declarations
   |(optional_semicolon@CSharp~CSharp4_0=959#58e3b60 Line 16 Column 1 File C:/temp/test.cs)optional_semicolon
   )class_declaration
  )namespace_member_declaration
 )namespace_member_declarations
)compilation_unit
Exiting with final status 0