【问题标题】:C#: Creating a Methodheader ParserC#:创建 Methodheader 解析器
【发布时间】:2011-04-20 16:07:28
【问题描述】:

我想编写一个解析器来告诉我字符串的哪一部分是方法头。在 C# 中执行此操作的最佳方法是什么?

语言语法规范can be found here。我认为这不是正确的 BNF/EBNF,所以也许有一种方法可以将其转换为这样的(例如将其放入正确 BNF 的 html 解析器。)

我应该以某种方式使用正则表达式还是自定义构建的解析器?我受到限制,因为我需要在没有外部工具帮助的情况下自己构建它。

【问题讨论】:

  • 关于我受限于我需要自己构建它而无需借助外部工具。 ...这是作业吗?
  • 哇,4+。我想是一群愤世嫉俗的人。不,这不是家庭作业。只是不喜欢使用其他人的工具,我知道人们在解析时喜欢在这里使用它们。
  • 所以你想重新发明轮子?这样做没有什么好处,IMO。
  • 我之所以问“没有外部工具的帮助”是因为......好吧,看看我的回答。
  • 嗯,请大家不要误会,但这种评论对话的方式可能没有成效。

标签: c# parsing methods text-parsing


【解决方案1】:

我发现the NRefactory library 是开源 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();
            }
        }
    }

ParserFactory 类是 NRefactory 的一部分。
在我的例子中,我想要一个描述 C# 缓冲区的 lisp s 表达式,所以我编写了一个遍历“CompilationUnit”的 S 表达式生成器。它只是一个节点树,从命名空间开始,然后是类/结构/枚举。在类/结构节点中,有方法节点(以及字段、属性等)。


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

在找到并接受 NRefactory 之前,我尝试生成 a wisent grammar for c#。这是在具有 wisent 引擎的 emacs 中使用的。

我永远无法让它正常工作。 也许它对你有用。


您说您不想使用“外部工具”。不确定该限制的动机;如果是家庭作业,那么我想这是有道理的,但出于其他目的,不使用已经存在的经过充分测试和易于理解的工具真的很可惜。

如果您接受我在此处提出的任何建议,那么您就是在建立在 something 的外部工具之上。但有些选项比其他选项要好一些。

【讨论】:

  • 谢谢。我可能不得不重新考虑我的限制。
  • 所以我最终安装了 git 以获取整个Sharp开发存储库。有没有一种简单的方法来获取 dll?另外,反射器仍然对您有用吗?上次我尝试使用它时,它会自行删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2012-01-15
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2011-04-18
相关资源
最近更新 更多