2010-04-17 54 views
10

我正在着手一些学习,我想用C++编写自己的语法高亮文件。你如何实现语法高亮?

任何人都可以给我如何去做这个想法吗?

要我看来,当一个文件被打开:

  1. 这将需要分析并决定什么类型的源文件是。信任的扩展可能不被防呆

  2. 办法知道关键字/命令适用什么给什么语言

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

我的一种方式想在OS X上使用C++或Objective-C来做到这一点。

任何人都可以提供关于我如何开始使用的指针?

回答

1

假设您正在使用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

由于众所周知的尿路感染的列表:

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

1

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

你可以得到C++关键字的列表在这里:http://www.cppreference.com/wiki/keywords/start

的颜色是由你(如果你愿意,你可以让他们配置和离开的选择给用户)

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

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