我正在开始学习,我想用C ++编写自己的语法高亮显示文件。
任何人都可以就如何做到这一点给我一些想法吗?
对我来说,似乎打开文件时:
需要解析并确定它是什么类型的源文件。信任扩展可能不是万无一失的
了解哪些关键字/命令适用于哪种语言的方法
决定每个关键字/命令获取颜色的方法
我想在OS X上使用C ++或Objective-C执行此操作。
任何人都可以提供有关我如何开始使用它的指示吗?
答案 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的概述:
有关已知UTI的列表:
你可能最感兴趣的两个键是kUTTypeObjectiveC PlusPlusSource和kUTTypeCPlusPlusHeader。
对于突出显示,您可能会发现此页面上的信息很有用,因为它讨论了使用NSView和临时属性的语法突出显示:
http://www.cocoadev.com/index.pl?ImplementSyntaxHighlightingUsingTemporaryAttributes