语法突出显示 - 最有效和专业的方式

时间:2010-03-10 14:38:06

标签: c# performance syntax-highlighting

问题:
我想要代码:语法高亮(编程语言)
语言:C#或汇编x86(最好是C#)
平台:Windows
资格:最有效的实施/最专业/像微软这样的大公司这样做的方式 重新说明:如何以目前已知的最有效方式在C#for Windows中实现语法高亮?

详细说明(随意跳过 - 不需要回答问题:)):
我不想只是任何实现它的方式 - 我已经看过几个 我想知道的是微软如何在Visual Studio上做得很好(无论哪个版本)。

在语法高亮方面,人们一直在努力重新发明轮子。我不明白为什么。
这被认为是一个非常难的问题吗?我已经看到只强调当前在屏幕上显示的内容的实现,我认为这是要走的路......(它使用了一些聪明的API来了解文本框的哪些行实际显示)。
我也看到过使用RichTextBox的实现,我认为不是的方式(也许我错了) - 我认为像子类化常规文本框上的文本并更改其刷子可能会更好(也许我已经看到了某个地方 - 我怀疑自己会想到这一点)
另外我听说有些人用AST实现它就像编译器会被编码一样(lexer部分,我想?) - 我希望这有点过分 - 我不认为这是有效的。 (未受过教育的猜测)

如果这确实是一个难题,那么大军队如何才能做到正确呢?例如,我从未听说过在Visual Studio中打破语法高亮的方法 但是任何其他实现它的工具都做得很糟糕,或者比大家伙更糟糕 什么是官方的“这是最好的方式,而任何其他方式是效率低”的方式呢?

我真的没有任何证据证明微软的方式更好,但是看到他们可能比其他任何人更了解Windows API,我猜想实现它的方法是最好的(我希望是错的 - 想象一下能够说我的语法高亮实现比MS更好!)

对于脱节的阐述感到抱歉 我也提前为任何失礼道歉 - 这是我的第一个问题。

3 个答案:

答案 0 :(得分:1)

最好的方法可能是重用现有的内容,例如ScintillaNET

答案 1 :(得分:1)

我认为没有“这是最好的方式,而其他任何方式效率都不高”这样做。实际上,我认为效率不是主要问题。相当复杂。 一个好的语法高亮显示器基于一个好的解析器。只要您可以解析代码,您就可以以任何您喜欢的方式突出显示它的每个部分。但是,当代码格式不正确时会发生什么?很多语法高亮显示只是突出显示关键字和一些块结构来克服这个问题。通过这样做,他们可以使用简单的正则表达式,而不是具有完整的,语法错误容忍的解析器(这是Visual Studio所拥有的)。

答案 2 :(得分:0)

与任何代码一样......很少有“最佳”方式。有多种做事方式,每种方式都有好处和缺点。

尽管如此,某种形式的Interpreter Pattern可能是最常见的方式。根据{{​​3}}:

  

解释器模式被广泛使用   在用。实现的编译器中   面向对象的语言,作为   Smalltalk编译器是。 SPECTalk   使用模式来解释   输入文件格式的描述。   QOCA约束求解工具包   用它来评估约束。

它还继续谈论它在适用性部分中的局限性

  
      
  • 语法很简单。对于复杂的语法,类的层次结构   语法变得庞大而难以管理。   解析器生成器等工具是一种   在这种情况下更好的选择
  •   
  • 效率不是一个关键问题。效率最高   口译员通常   通过解释解析来实现   树直接但首先   将它们翻译成另一种形式。   例如,正则表达式是   经常变成国家机器。   但即便如此,译者也可以   由口译员实施   模式,所以模式仍然   适用。
  •   

了解这一点,您现在应该知道为什么在与它进行多次匹配之前,首先预先编译可重用的RegEx。如果不这样做,则每次都必须执行两个步骤(转换,解释),而不是一次构建状态机,并多次有效地应用它。

特别是对于您所描述的解释类型,Microsoft公开了the GoF book命名空间及其所有强大功能,作为Microsoft.VisualStudio的一部分。您还可以查看Visual Studio SDK以获取动态代码生成和编译。