5

语法荧光笔使用的一般算法是什么?我在正则表达式中使用交替实现了一种简单的方法:

STRING_PATTERN|COMMENT_PATTERN|KEYWORD_PATTERNS

因为检测某个东西是字符串还是模式取决于哪个先出现:

// This is a "comment"

"This is a // string"

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

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

编辑:

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

4

1 回答 1

9

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

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

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

例如,一个字符串可以是两个双引号以及介于两者之间的所有内容(另一个双引号除外)。注释是两个斜杠以及直到行尾的所有内容。

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

当有多个可能的匹配规则时,它会变得更加复杂,例如单行和多行注释。如果您抓取一个斜杠字符,您的程序需要读取另一个字符才能拒绝其中的一些选项,即直到它获得第二个斜杠或 * 时,它才会知道它在哪种标记中。

从根本上说,这一切都归结为状态机。你可以尝试构建自己的,或者你可以得到像 Antlr 这样的东西,给它一个语法,让它为你完成所有的工作。

于 2011-07-19T04:52:39.327 回答