11

我正在进行一些学习,我想为 C++ 中的文件编写自己的语法突出显示。

谁能给我一些关于如何去做的想法?

在我看来,当打开文件时:

  1. 它需要被解析并决定它是什么类型的源文件。信任扩展可能不是万无一失的

  2. 一种了解哪些关键字/命令适用于哪种语言的方法

  3. 一种决定每个关键字/命令获得什么颜色的方法

我想在 OS X 上使用 C++ 或 Objective-C 执行此操作。

任何人都可以提供有关我如何开始使用此功能的指示吗?

4

4 回答 4

16

语法荧光笔通常不会超出词法分析的范围,这意味着您不必将整个语言解析为语句、声明和表达式等等。您只需要编写一个词法分析器,使用正则表达式相当容易。我建议你从学习正则表达式开始,如果你还没有的话。整个过程需要 30 分钟。

您可能需要考虑使用 Flex(词法分析器生成器;https://github.com/westes/flex)作为学习练习。在 Flex 中实现一个基本的语法高亮器应该很容易,它输出高亮的 HTML 或其他东西。

简而言之,你会给 Flex 一组正则表达式以及如何处理匹配文本,生成器会贪婪地匹配你的表达式。您可以在排他状态之间进行词法分析器转换(例如,输入和输出字符串文字、注释等),如flex FAQ中所示。这是用 Flex 编写的 C 词法分析器的规范示例:http ://www.lysator.liu.se/c/ANSI-C-grammar-l.html 。

制作可扩展的语法荧光笔将是您旅程的下一部分。虽然我绝不是 XML 的粉丝,但请看一下 Kate 语法高亮文件是如何定义的,例如C++ 的这个。你的任务是弄清楚你想如何定义语法高亮,然后制作一个程序来使用这些定义来生成 HTML 或任何你喜欢的东西。

于 2010-04-17T01:43:55.540 回答
1

您可能想看看GeSHI如何实现突出显示等。此外,它有一大堆语言包,其中包含您想要的所有关键字。

于 2010-04-17T01:53:49.643 回答
0

我认为 (1) 是不可能的,因为判断文件是否有效 C++ 的唯一方法是通过 C++ 解析器运行它并查看它是否解析......但如果你使用它作为你的标准,你不能t 对无法编译的代码进行操作,因为它是一个正在进行的工作,您可能想要这样做。最好只信任扩展,因为我认为没有其他方法会比这更好。

您可以在此处获取 C++ 关键字列表:http ://www.cppreference.com/wiki/keywords/start

颜色由您决定(或者,如果您愿意,可以使它们可配置,并将选择权留给用户)

于 2010-04-17T01:32:51.073 回答
0

假设您使用的是 Cocoa 框架,您可以使用 UTI 来确定文件类型。

有关 api 的概述:

http://developer.apple.com/mac/library/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_intro/understand_utis_intro.html#//apple_ref/doc/uid/TP40001319-CH201-SW1

有关已知 UTI 的列表:

http://developer.apple.com/mac/library/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259-SW1

您可能最感兴趣的两个键是 kUTTypeObjectiveC​PlusPlusSource 和 kUTTypeCPlusPlusHeader。

对于突出显示,您可能会发现此页面上的信息很有帮助,因为它讨论了使用 NSView 和临时属性的语法突出显示:

http://www.cocoadev.com/index.pl?ImplementSyntaxHighlightingUsingTemporaryAttributes

于 2010-04-17T02:12:02.833 回答