C#:创建Methodheader解析器

C#:创建Methodheader解析器,c#,parsing,methods,text-parsing,C#,Parsing,Methods,Text Parsing,我想编写一个解析器来告诉我字符串的哪一部分是methodheader。在C#中,最好的方法是什么 语言语法规范。我不认为这是正确的BNF/EBNF,所以也许有一种方法可以将其转换为这样的格式(就像html解析器将其转换为正确的BNF) 我应该使用正则表达式还是自定义的解析器?我的局限性在于我需要在没有外部工具帮助的情况下自己构建它。我发现,作为开源SharpDevelop工具的一部分,我非常擅长将C#模块解析为抽象语法树。一旦你有了它,你就可以很容易地浏览,找到方法头、位置等等 虽然它主要用于S

我想编写一个解析器来告诉我字符串的哪一部分是methodheader。在C#中,最好的方法是什么

语言语法规范。我不认为这是正确的BNF/EBNF,所以也许有一种方法可以将其转换为这样的格式(就像html解析器将其转换为正确的BNF)

我应该使用正则表达式还是自定义的解析器?我的局限性在于我需要在没有外部工具帮助的情况下自己构建它。

我发现,作为开源SharpDevelop工具的一部分,我非常擅长将C#模块解析为抽象语法树。一旦你有了它,你就可以很容易地浏览,找到方法头、位置等等

虽然它主要用于SharpDevelop(一个GUI工具),但它是一个独立的DLL,可以在任何.NET应用程序中使用。据我所知,文档不是很全面,但Reflector让我检查一下,并很容易地解决问题

一些代码:

    internal static string CreateAstSexpression(string filename)
    {
        using (var fs = File.OpenRead(filename))
        {
            using (var parser = ParserFactory.CreateParser(SupportedLanguage.CSharp,
                                                           new StreamReader(fs)))
            {
                parser.Parse();

                // RetrieveSpecials() returns an IList<ISpecial>
                // parser.Lexer.SpecialTracker.RetrieveSpecials()...
                // "specials" == comments, preprocessor directives, etc.

                // parser.CompilationUnit retrieves the root node of the result AST
                return SexpressionGenerator.Generate(parser.CompilationUnit).ToString();
            }
        }
    }
内部静态字符串CreateAstSexpression(字符串文件名)
{
使用(var fs=File.OpenRead(文件名))
{
使用(var parser=ParserFactory.CreateParser(SupportedLanguage.CSharp,
新StreamReader(fs)))
{
parser.Parse();
//RetrieveSpecials()返回IList
//parser.Lexer.SpecialTracker.RetrieveSpecials()。。。
//“specials”==注释、预处理器指令等。
//parser.CompliationUnit检索结果的根节点
返回SexpressionGenerator.Generate(parser.CompilationUnit.ToString();
}
}
}
ParserFactory类是NRefactory的一部分。
在我的例子中,我需要一个lisp s表达式来描述C#缓冲区,因此我编写了一个s表达式生成器,它遍历“compileUnit”。它只是一个节点树,从名称空间开始,然后是class/struct/enum。在类/结构节点中,有方法节点(以及字段、属性等)


如果完成的DLL不感兴趣,那么这可能是

在找到并接受新工厂之前,我试着生产。这是在emacs中使用的,它有一个wisent引擎

我从来都不能让它正常工作。 也许这对你有用


你说你不想使用“外部工具”。不确定限制的动机;如果它是家庭作业,那么我想它是有意义的,但是出于其他目的,如果不使用已经存在的经过良好测试和理解的工具,那真的是一件很遗憾的事情

如果你接受我在这里提出的任何一个建议,你是在构建一个外部工具。但是有些选项比其他的要好一点。

我发现,作为开源SharpDevelop工具的一部分,我非常擅长将C#模块解析为抽象语法树。一旦你有了它,你就可以很容易地浏览,找到方法头、位置等等

虽然它主要用于SharpDevelop(一个GUI工具),但它是一个独立的DLL,可以在任何.NET应用程序中使用。据我所知,文档不是很全面,但Reflector让我检查一下,并很容易地解决问题

一些代码:

    internal static string CreateAstSexpression(string filename)
    {
        using (var fs = File.OpenRead(filename))
        {
            using (var parser = ParserFactory.CreateParser(SupportedLanguage.CSharp,
                                                           new StreamReader(fs)))
            {
                parser.Parse();

                // RetrieveSpecials() returns an IList<ISpecial>
                // parser.Lexer.SpecialTracker.RetrieveSpecials()...
                // "specials" == comments, preprocessor directives, etc.

                // parser.CompilationUnit retrieves the root node of the result AST
                return SexpressionGenerator.Generate(parser.CompilationUnit).ToString();
            }
        }
    }
内部静态字符串CreateAstSexpression(字符串文件名)
{
使用(var fs=File.OpenRead(文件名))
{
使用(var parser=ParserFactory.CreateParser(SupportedLanguage.CSharp,
新StreamReader(fs)))
{
parser.Parse();
//RetrieveSpecials()返回IList
//parser.Lexer.SpecialTracker.RetrieveSpecials()。。。
//“specials”==注释、预处理器指令等。
//parser.CompliationUnit检索结果的根节点
返回SexpressionGenerator.Generate(parser.CompilationUnit.ToString();
}
}
}
ParserFactory类是NRefactory的一部分。
在我的例子中,我需要一个lisp s表达式来描述C#缓冲区,因此我编写了一个s表达式生成器,它遍历“compileUnit”。它只是一个节点树,从名称空间开始,然后是class/struct/enum。在类/结构节点中,有方法节点(以及字段、属性等)


如果完成的DLL不感兴趣,那么这可能是

在找到并接受新工厂之前,我试着生产。这是在emacs中使用的,它有一个wisent引擎

我从来都不能让它正常工作。 也许这对你有用


你说你不想使用“外部工具”。不确定限制的动机;如果它是家庭作业,那么我想它是有意义的,但是出于其他目的,如果不使用已经存在的经过良好测试和理解的工具,那真的是一件很遗憾的事情


如果你接受我在这里提出的任何一个建议,你是在构建一个外部工具。但是有些选项比其他的好一点。

关于我的限制,我需要在没有外部工具帮助的情况下自己构建它。。。这是家庭作业吗?哇,4+。我想是一群愤世嫉俗的人吧。不,这不是家庭作业。只是不喜欢使用别人的工具,我知道人们在这里讨论解析时是多么喜欢使用它们。所以你喜欢重新发明轮子?在我看来,这样做没有什么好处。我之所以问“没有外部工具的帮助”是因为。。。好吧,看看我的答案。嗯,大家请不要误会,但是这个评论对话的方式可能没有效果。关于我的限制,我需要在没有外部t的帮助下自己构建它