你如何实现语法高亮?

时间:2010-04-17 00:56:17

标签: c++ objective-c macos syntax-highlighting lexical-analysis

我正在开始学习,我想用C ++编写自己的语法高亮显示文件。

任何人都可以就如何做到这一点给我一些想法吗?

对我来说,似乎打开文件时:

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

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

  3. 决定每个关键字/命令获取颜色的方法

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

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

4 个答案:

答案 0 :(得分:12)

语法高亮显示器通常不会超越词法分析,这意味着您不必将整个语言解析为语句,声明和表达式等等。你只需要写一个词法分析器,这对于正则表达式来说相当容易。我建议你从学习正则表达式开始,如果你还没有。全程30分钟。

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

简而言之,您将为Flex提供一组正则表达式以及如何处理匹配文本,并且生成器将贪婪地与您的表达式匹配。如the flex FAQ所示,您可以在独占状态(例如,字符串文字内容和注释等)之间进行词法分析器转换。以下是使用Flex编写的C词法分析器的典型示例:http://www.lysator.liu.se/c/ANSI-C-grammar-l.html

制作可扩展的语法高亮显示器将是您旅程的下一部分。虽然我不是XML的粉丝,但请看看如何定义Kate语法高亮文件,例如this one for C++。您的任务是弄清楚如何定义语法高亮显示器,然后制作一个使用这些定义生成HTML或任何您喜欢的程序。

答案 1 :(得分:1)

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

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

颜色取决于您(或者如果您愿意,您可以将它们配置为可选项并留给用户)

答案 2 :(得分:1)

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

答案 3 :(得分: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