语法高亮/词法分析算法

时间:2011-07-19 01:51:17

标签: algorithm text syntax highlighting lexical

语法高亮显示器使用的通用算法是什么?我在正则表达式中使用了交替实现了一种简单的方法:

  

STRING_PATTERN | COMMENT_PATTERN | KEYWORD_PATTERNS

因为检测某些东西是字符串还是模式取决于首先出现的是什么:

// This is a "comment"

"This is a // string"

但是关键字会变得更复杂一些。这种方法在我目前的实现中有效,但我不相信它是最佳的。

另一个问题是您突出显示的顺序。如果您在标识符/关键字之前突出显示数字,那么您可能会意外地突出显示关键字中的数字...

修改

我的插件现在在这里:http://wordpress.org/extend/plugins/crayon-syntax-highlighter/

1 个答案:

答案 0 :(得分:6)

你可能很难用正则表达式来做这件事,因为它无法帮助你的语法高亮理解上下文,即正则表达式会匹配出现在任何地方的东西,无论它是否是更大可能匹配的一部分。

您需要调查解析器生成器,例如Antlr,它具有有效,明确的语法 - 能够为您提供将这些细节考虑在内的令牌。例如。如果注释被定义为“//”直到EOL,它将返回一个注释标记,它将取代任何字符串字符或其他内容。

像这样的解析器的标准方法是一次一个地读取字符流(或标记,更具体地说),因此突出显示不取决于您定义的规则的顺序,而是它们的外观顺序流。

例如,一个字符串可以是两个双引号和中间的所有内容(除了另一个双引号)。评论是两个斜线,一切都在行尾。

解析时,如果你找到双引号,那么你的程序进入“我认为它是一个字符串”模式,一旦找到匹配的结束引号,它就会确认一个字符串标记,然后返回它以突出显示。类似地,如果它找到两个斜杠,那么它会搜索直到找到行尾(或实际上是文件结尾),然后将其作为突出显示的标记返回。

当存在多个可能的匹配规则时会变得更复杂,例如用于单行和多行注释。如果你抓一个斜杠字符,你的程序需要先读取另一个字符,然后才能拒绝其中一些选项,即直到它得到第二个斜杠或*然后它就不知道它是什么类型的标记。

从根本上说,这一切都归结为状态机。您可以尝试构建自己的,或者您可以获得类似Antlr的东西,为它提供语法,然后让它为您完成所有工作。