gpt4 book ai didi

algorithm - 语法高亮/词法分析算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:08:16 28 4
gpt4 key购买 nike

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

STRING_PATTERN|COMMENT_PATTERN|KEYWORD_PATTERNS

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

// This is a "comment"

"This is a // string"

但是关键字会变得有点复杂。这种方法在我当前的实现中有效,但我不认为它是最佳的。

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

编辑:

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

最佳答案

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

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

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

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

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

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

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

关于algorithm - 语法高亮/词法分析算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6741467/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com