C# 代码解析

10
我正在研究解析代码文件的方法、工具和技术,以支持使用C#编写的编辑器中的语法高亮和智能提示。是否有人对此有任何想法/模式和实践/工具/技术?
编辑:对于任何感兴趣的人来说,以下是一个不错的信息来源:
解析超出上下文无关文法 ISBN 978-3-642-14845-3

1
你是想解析C#还是用C#编写解析器? - Gabe
1
@Gabe,都可以。我试图在C#中编写一个解析器,它将解析xml,C#,希望能够解析其他东西 :) - sTodorov
1
如果你想解析多种语言,你看过ANTLR了吗? - Gabe
4
这在很大程度上取决于你希望它有多复杂。如果你想要完整的Visual Studio体验,你需要一个完整的解析器,但如果你只想要简单的关键字/字符串突出显示(就像StackOverflow提供的那样),那么你不需要一个解析器。你只需要一个简单的分词器来区分字符串和标识符,以及一些关键字列表即可。 - arx
1
@sTodorov:无论如何,我想说的是你需要一种具有弹性的解析器,它知道如何以最小的努力进行回溯。大多数类似于yacc的解析器生成器都可以修改为此行为,尽管效率不同。 - leppie
显示剩余9条评论
3个回答

6

Irony支持多语言解析吗? - sTodorov
Irony是用于创建解析器的,因此它可以解析任何您可以为其构建语法的内容。 - Rob Fonseca-Ensor

3
有两种基本方法:
1)解析整个解决方案及其引用的所有内容,以便了解代码中涉及的所有类型。
2)在本地解析,并尽力猜测类型等信息。

第二种方法的问题在于你必须猜测,在某些情况下,仅从代码片段中就无法确定所有内容。但如果你对(例如)Stack Overflow上显示的语法高亮效果满意,则这种方法很容易且相当有效。

要执行(1),则需要执行以下操作之一(按难度递减的顺序):

  • 解析所有源代码。如果引用了第三方程序集,则不可能实现。
  • 对编译后的代码使用反射来获取可在解析源代码时使用的类型信息。
  • 使用主机IDE(如果可用-因此在您的情况下不适用!)的代码元素接口提供所需的信息。

1
OP想要解析多种语言。实际上,获取所需处理语言的工作语法存在“小”问题。对于传统语言来说,这很难做到,因为标准委员会一直在用胶水装饰它们;请查看IBM Enterprise COBOL或Fortran 2005。现代语言稍微容易一些,但它们也有添加内容的压力;尝试解析现代VB.net。我已经花费15年时间使用统一结构构建解析器,涵盖了广泛的语言(包括我提到的那些),但我还没有完成 :-{ - Ira Baxter
1
@Ira:OP并没有很清楚地说明需要哪些语言,但我的大部分回答同样适用于任何语言。但你是对的,这是一个非常棘手的问题。Visual Studio Intellisense已经由一支经验丰富的团队开发了多年,只在.net语言中表现良好——除了基本的语法高亮之外,在大多数其他语言中支持都相当差,这是OP试图解决的问题难度的一个很好的指标。 - Jason Williams
@Ira,你想要实现的功能听起来非常严肃。我祝你成功。然而,我正在研究的主要是对C#、Ruby、Python、VB.net和Java的支持。我只能想象解析旧语言所涉及的困难。 - sTodorov
@Jason,我认为现在我会集中研究解析C#和Python,因为它们的结构有所不同,例如花括号和缩进。 - sTodorov
@Ira:目前来看,语法高亮似乎是更好的选择,因为它不涉及太多复杂性。我会研究一下正则表达式引擎在这方面如何帮助我。顺便说一句,抱歉打扰了,但DMS软件工具包似乎非常有趣。 - sTodorov
显示剩余4条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接