29

我希望为我正在考虑从事的暑期项目编写自己的语法荧光笔,但我不确定如何编写自己的语法荧光笔。

我知道那里有很多实现,但我想了解正则表达式以及语法突出显示的工作原理。

语法高亮是如何工作的,有哪些很好的参考来开发一个?语法荧光笔是在键入每个字符时扫描它,还是在键入每个字符后将整个文档/文本区域扫描?

任何见解将不胜感激。

谢谢。

PS:我打算用 ActionScript 写它

4

7 回答 7

26

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

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

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

于 2009-04-30T22:44:20.950 回答
13

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

用 JavaScript 编写的一个非常基本的高亮程序如下所示:

var keywords = [ "public", "class", "private", "static", "return", "void" ];
for (var i = 0; i < keywords.length; i++)
{
        var regex = new RegExp("([^A-z0-9])(" + keywords[i] + ")([^A-z0-9])(?![^<]*>|[^<>]*</)", "g");
        code = code.replace(regex, "$1<span class='rm-code-keyword'>$2</span>$3");
}
于 2017-05-09T08:23:04.357 回答
4

StackOverflow 播客第 50期中,Steve Yegge 谈到了他创建一些通用高亮机制的项目。不是成品,可能比您正在寻找的更复杂,但可能会有一些有趣的东西。

于 2009-04-30T22:40:17.887 回答
4

Udacity 课程 CS262是一种方法的良好开端。标题是构建一个 Web 浏览器,但该课程真正关注的是您正在寻找的问题 - 如何解析和 lex 一组文本。在您的情况下,您将使用该信息进行突出显示。我刚拿了它,它非常好。课程现在“结束”了,但视频和练习题/作业仍然可以观看。

于 2012-06-15T12:05:10.300 回答
3

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

但除此之外,编写语法荧光笔的一个好的开始是查看现有的。例如,vim具有普通文本文件形式的语法文件,因此您可以先查看这些文件。那里有一堆正则表达式(正则表达式有几种风格,但它们并没有太大的不同......),所以对于这部分你可能会看一些书。

就个人而言,我发现Beginning 正则表达式是一个不错的表达式。掌握正则表达式对于更高级的科目也很好。另一方面,正则表达式袖珍参考非常适合确定上述风格的差异,因为它还包括关于 vim 正则表达式的一章。

于 2009-04-30T22:45:07.953 回答
2

如果您解释此语法荧光笔的用途可能会有所帮助。如果您是在动作脚本中编写它,您的想法是在 Flash 电影中使用一个文本框并在按下提交按钮后突出显示语法吗?或者您想从某个 web 服务中读取文本,然后显示突出显示的语法?...我很难提供帮助,因为我很难想象你在做什么

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

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

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

.reserved{
  color: #ff0000;
}

这是基本概念,您可能想从geshi那里获取想法,因为您可以查看源代码。

于 2009-04-30T22:36:18.253 回答
1

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

您可以找到包含源代码的 sqlcodecoloring.zip 链接。它是使用标记器和 TextRange 类实现的。

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

于 2009-06-17T01:00:45.573 回答