编写语法荧光笔

时间:2009-04-30 22:27:09

标签: regex actionscript-3 syntax-highlighting

我希望为我正在考虑的夏季项目编写自己的语法高亮显示器,但我不确定如何编写自己的语法高亮显示器。

我知道有很多实现,但我想了解正则表达式以及语法高亮处理的工作原理。

语法突出显示如何工作以及开发语法有哪些好的参考?语法高亮显示器在键入每个字符时是否会扫描每个字符,还是在键入每个字符后整体扫描文档/文本区域?

非常感谢任何见解。

感谢。

PS:我打算用ActionScript编写它

7 个答案:

答案 0 :(得分:19)

语法荧光笔可以两种非常通用的方式工作。第一个为突出显示的语言实现完整的词法分析器和解析器,准确识别每个标记的类型(关键字,类名,实例名,变量类型,预处理器指令......)。这提供了根据一些规范精确突出代码所需的所有信息(红色的关键字,蓝色的类名,你有什么)。

第二种方式类似于Google Code Prettify使用的方式,而不是每种语言实现一个词法分析器/解析器,使用了几个非常通用的解析器,它们可以在大多数语法上做得不错。例如,这个荧光笔将能够合理地解析和突出任何类C语言,因为它的词法分析器/解析器可以识别这些语言的一般组件。

这也有一个优点,因此,您不需要明确指定语言,因为引擎将自己确定哪些通用解析器可以做到最好。当然,缺点是突出显示不如使用特定于语言的解析器时那么完美。

答案 1 :(得分:4)

StackOverflow podcast number 50中,史蒂夫·叶格(Steve Yegge)谈了他关于创建一些一般性突出机制的项目。不是成品,可能比你想要的更复杂,但可能有一些有趣的东西。

答案 2 :(得分:4)

构建语法高亮显示是指在代码中查找特定关键字并为其提供特定样式(字体,字体样式,颜色等)。为了实现这一点,您需要定义特定于编写代码的编程语言的关键字列表,然后解析文本(例如使用正则表达式),找到特定的标记并用适当的样式替换它们HTML标记。

用JavaScript编写的一个非常基本的高级用户看起来像这样:

item

答案 3 :(得分:3)

如果您解释这种语法高亮显示器的用途,可能会有所帮助。如果您在动作脚本中编写它,您是否想在Flash影片中设置一个文本框并在按下提交按钮后突出显示语法?或者您想阅读某些Web服务中的文本,然后显示突出显示的语法? ......我很难帮忙,因为我很难想象你在做什么

然而,语法高亮显示器读取文本,然后将代码行与一些正则表达式进行比较,这有助于语法高亮显示器找出单词的含义。例如,它可能会将单词“function”或“int”读作保留字,并将其替换为html文本:

<span class="reserved">function</span>, <span class="reserved"></span>

假设你有css并想要保留红色字,

.reserved{
  color: #ff0000;
}

这是基本概念,您可能希望从geshi获取创意,因为您可以查看来源。

答案 4 :(得分:2)

不幸的是,我从未使用过Actionscript,所以我无法帮助解决这个问题。

但除此之外,编写语法高亮显示器的良好开端是查看现有的。例如,vim具有普通文本文件形式的语法文件,因此您可以查看这些文件的开头。那里有一堆正则表达式(正则表达式有几种形式,但它们并没有那么不同......),所以对于那部分你可能会看一些书。

就个人而言,我发现Beginning regular expressions是一个不错的人。 Mastering regular expressions对于更高级的科目也很好。另一方面,Regular expressions pocket reference很适合确定上述风格的差异,因为它还包含了关于vim正则表达式的一章。

答案 5 :(得分:2)

这方面的一个良好开端是Udacity course CS262。标题是构建一个Web浏览器,但实际上该类主要关注您正在寻找的问题 - 如何解析和lex一组文本。在您的情况下,您可以使用该信息进行突出显示。我刚拿了它,非常好。该课程是&#34; over&#34;现在,但视频和练习问题/作业仍然可以观看。

答案 6 :(得分:1)

我刚才在我的博客上发布了一个SQL代码着色工具: http://gruchalski.com/2009/04/26/flex-textrange-performance-issue-on-linux/

您可以在源代码中找到sqlcodecoloring.zip的链接。它使用tokenizer和TextRange类实现。

另一个链接,sql代码着色作为原型应用程序的一部分: http://github.com/radekg/mysqlinterface/tree/master