【问题标题】:How do you implement syntax highlighting?你如何实现语法高亮?
【发布时间】:2011-02-09 01:15:34
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        假设您使用的是 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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-10-06
            • 2012-04-14
            • 2010-12-09
            • 2011-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多