【问题标题】:Syntax highlight design pattern语法高亮设计模式
【发布时间】:2009-04-02 04:43:27
【问题描述】:

我正在寻找一些关于在文本框中启用语法突出显示的最佳实践和常见模式的良好概述。这似乎是一个非常常见的练习,几乎所有语言都有一个 UI 控件,可以启用不同语言的语法突出显示。我只是想看看是否有一个共同的实现模式。

每个人都使用正则表达式吗?是否有语法高亮场景中常用的正则表达式存储库?

是否有替代/更好的语法高亮方法?

更新

链接到有关以给定语言执行语法突出显示的相关资源或与语法突出显示相关的概念会很棒。 Lexing(词法分析)是在答案中提出的,但没有了解更多信息的链接。任何有助于更好地理解这个普遍解决的问题的东西都会很棒。

Lexical Analysis on Wikipedia

【问题讨论】:

  • +1 我也很想知道这个……我怀疑正则表达式对于大文件来说太慢了,或者至少它们不适用于复杂的事情,比如只突出显示变量已定义。

标签: language-agnostic syntax-highlighting


【解决方案1】:

正则表达式绝对是最开始的第一个地方。但是,它们无法真正应对大多数语言中遇到的许多边缘情况——看起来像关键字的文本可以在找到的字符串文字中,而字符串文字又可以包含转义的分隔符以及特殊字符。 cmets 等也是如此。

基本上,要做好语法突出显示,您需要对源进行词法分析 - 使用特定于语言的启发式方法对其进行解析,以构建区域列表,其中源的每个区域都用它的方式进行注释样式。

随着编辑的进行,您可以再次应用语言规则来查看此更改可以在多大程度上改变区域的呈现方式。例如,在字符串文字中输入一个字母只会使字符串文字区域变长,但输入右引号会截断该区域并将其剩余部分转换为代码,这取决于所有其他词法规则。

【讨论】:

  • 所以我猜大多数基于 Web (javascript) 的荧光笔都在使用正则表达式,而实际的 IDE 正在使用词法分析?
  • 可能 - 尽管即使使用 JS,优秀的编辑器也可能会 lex。正则表达式的,嗯,他们有时会感到困惑。我知道我在一些编辑中看到过这种情况,他们认为转义的引号实际上是字符串分隔符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多