语法高亮显示器使用的通用算法是什么?我在正则表达式中使用了交替实现了一种简单的方法:
STRING_PATTERN | COMMENT_PATTERN | KEYWORD_PATTERNS
因为检测某些东西是字符串还是模式取决于首先出现的是什么:
// This is a "comment"
"This is a // string"
但是关键字会变得更复杂一些。这种方法在我目前的实现中有效,但我不相信它是最佳的。
另一个问题是您突出显示的顺序。如果您在标识符/关键字之前突出显示数字,那么您可能会意外地突出显示关键字中的数字...
修改
我的插件现在在这里:http://wordpress.org/extend/plugins/crayon-syntax-highlighter/
答案 0 :(得分:6)
你可能很难用正则表达式来做这件事,因为它无法帮助你的语法高亮理解上下文,即正则表达式会匹配出现在任何地方的东西,无论它是否是更大可能匹配的一部分。
您需要调查解析器生成器,例如Antlr,它具有有效,明确的语法 - 能够为您提供将这些细节考虑在内的令牌。例如。如果注释被定义为“//”直到EOL,它将返回一个注释标记,它将取代任何字符串字符或其他内容。
像这样的解析器的标准方法是一次一个地读取字符流(或标记,更具体地说),因此突出显示不取决于您定义的规则的顺序,而是它们的外观顺序流。
例如,一个字符串可以是两个双引号和中间的所有内容(除了另一个双引号)。评论是两个斜线,一切都在行尾。
解析时,如果你找到双引号,那么你的程序进入“我认为它是一个字符串”模式,一旦找到匹配的结束引号,它就会确认一个字符串标记,然后返回它以突出显示。类似地,如果它找到两个斜杠,那么它会搜索直到找到行尾(或实际上是文件结尾),然后将其作为突出显示的标记返回。
当存在多个可能的匹配规则时会变得更复杂,例如用于单行和多行注释。如果你抓一个斜杠字符,你的程序需要先读取另一个字符,然后才能拒绝其中一些选项,即直到它得到第二个斜杠或*然后它就不知道它是什么类型的标记。
从根本上说,这一切都归结为状态机。您可以尝试构建自己的,或者您可以获得类似Antlr的东西,为它提供语法,然后让它为您完成所有工作。