关于c#:语法突出显示 – 最有效和专业的方式

Syntax Highlighting - most efficient and professional way

问题:我想要代码:语法突出显示(编程语言)语言:C或程序集x86(最好是C_)平台:Windows资质:最有效的实施方式/最专业的方式/像微软这样的大公司的方式重新表述:我如何以目前已知的最有效的方式在C for Windows中实现语法突出显示?阐述(请随意跳过-不需要回答问题:):我不想用任何方法来实现它——我已经看过好几种了。我想知道的是微软在Visual Studio(无论哪个版本)上的表现如何。当涉及到语法高亮时,人们总是试图重新发明轮子。我不明白为什么。这是一个很难解决的问题吗?我见过一些只突出显示屏幕上当前显示内容的实现,我认为这是一种方法…(它使用了一些聪明的API来了解文本框中实际显示的行)。我也看到过使用richtextbox的实现,我认为这不是一个好方法(也许我这里错了)——我认为像在常规文本框上绘制文本并更改其画笔的例程的子类化可能更好(也许我在某个地方看到过这种情况——我怀疑我自己会想到这一点)。另外,我听说有些人使用AST实现它,就像编译器被编码一样(我认为是lexer部分?)-我希望这太过分了-我不认为这是有效率的。(未受教育的猜测)如果这真的是一个难题,那么大部队是怎么做到的呢?例如,我从来没有听说过在Visual Studio中打破语法突出显示的方法。但是任何其他实现它的工具都做得很糟糕,或者比大人物更糟糕。什么是官方的"这是最好的方法,其他任何方法都不那么有效"的方法?我真的没有任何证据表明微软的方法更好,但是看到他们可能比任何人都更了解Windows API,我想有一种实现它的方法是最好的(我很乐意出错-想象一下我的语法突出显示的实现比微软的好!)抱歉,我的阐述不连贯。我也为任何失礼提前道歉-这是我的第一个问题。


我不认为有一种"这是最好的方法,而任何其他方法都是不高效的"方法可以做到这一点。实际上,我不认为效率是主要问题。相当复杂。良好的语法高亮显示基于良好的语法分析器。只要你能解析代码,你就可以用你喜欢的任何方式突出显示它的每一部分。但是,当代码格式不正确时会发生什么呢?很多语法高亮只强调关键字和几个块结构来解决这个问题。通过这样做,他们可以使用简单的正则表达式,而不是拥有一个成熟的、语法上允许错误的解析器(这就是Visual Studio所拥有的)。


最好的方法可能是重用现有的东西,比如闪烁网。


就像任何代码一样……很少有"最好"的方法。做事情有多种方法,每种方法都有好处和缺点。

也就是说,某种形式的解释器模式可能是最常见的方式。根据GOF手册:

The Interpreter pattern is widely used
in compilers implemented with
object-oriented languages, as the
Smalltalk compilers are. SPECTalk
uses the pattern to interpret
descriptions of input file formats.
The QOCA constraint-solving toolkit
uses it to evaluate constraints.

它还将继续讨论它在适用性部分的局限性。

  • the grammer is simple. For complex grammars, the class hierarchy for the
    grammer becomes large and unmanagable.
    Tools such as parser generators are a
    better alternative in such cases
  • effeciency is not a critical concern. The most efficient
    interpreters are usually not
    implemented by interpreting parse
    trees directly but by first
    translating them into another form.
    For example, regular expressions are
    often transformed into state machines.
    But even then, the translator can be
    implemented by the Interpreter
    pattern, so the pattern is still
    applicable.

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

具体来说,对于您描述的解释类型,Microsoft将Microsoft.VisualStudio命名空间及其所有功能强大的功能作为Visual Studio SDK的一部分公开。您还可以查看system.codedom以生成和编译动态代码。