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