为类 C 着色的算法 /* 注释块 */ [关闭]

Posted

技术标签:

【中文标题】为类 C 着色的算法 /* 注释块 */ [关闭]【英文标题】:Algorithm to colorize C-like /* comment blocks */ [closed] 【发布时间】:2015-02-09 20:24:26 【问题描述】:

我有一个简单的文本编辑器。我想为它添加一个类似 C 的 /* comment blocks */ 着色器。 我的意思当然是多线 cmets。

它的数据结构如下:

struct TextEdit

    struct Line
    
        char* str;
        int len;
    ;

    Line* index;
    int lines;

    void Modified( int line_from, int line_to );

    bool IsInBlockComment( int line, int column );
;

每次修改文本时都会调用Modified(),因此编辑器有机会重新扫描修改后的行范围内的内容。

您将如何实现IsInBlockComment() 方法,该方法可以确定文本中的给定位置是否在块注释内? Modified() 应该添加和维护哪些额外的数据才能高效地执行此操作?

重要细节:

/**/ 标记如果出现在 // 注释之后或出现在 ""'' 文字字符串中,则它们不应生效。

我不是要求工作源代码或详细规格,我只是要求一个简短的概念。

【问题讨论】:

这并不是一项简单的任务。您必须实现一个处理单行 cmets 和字符串的解析器。 它已经解析了单行 cmets 和 '' "" 文字,最重要的是 /* */,这样我就不需要在每次它有微小变化时重新解析整个文档,如所示通过修改方法。 struct 看起来不像是 C,而是 C++。 @thumbmunkeys:文本中 /* 开仓和 */ 平仓的链接列表,由于非修改行的行号经常变化,因此维护起来没有太大帮助。我还尝试了每行额外的标志,表明该行完全在块注释内 - 更好一点。但我的问题是关于你的想法不是我的:) @Anonymous 你总是应该就一个问题展示你自己的研究成果,即使它不成功 【参考方案1】:

首先要注意 C 支持多行字符串,所以你已经遇到了这个问题,只是没有解决它。

您的解析器引擎有一个状态。您必须知道您是在文字字符串中还是在 C 之类的注释中。

将此状态存储为每行的起始位置。这样解析器就可以从中断的地方继续。 如果下一行的新状态与旧状态不同,则必须继续解析,否则可以停止。

通过控制此类状态快照的频率(例如:仅每 10 行存储一次),您可以控制速度和内存占用之间的权衡。

【讨论】:

好一个,这是否可以在重新解析修改块后以某种方式检测到何时停止解析?我真的不想重新解析直到文件结束。这足以检查以前的解析状态是否与当前解析器相同? 是的。我已经在答案中告诉了这一点。 这是一个绝妙的答案!节省了我大量尝试其他事情的时间并提供了最佳性能,它易于维护并且对额外存储的需求非常低。

以上是关于为类 C 着色的算法 /* 注释块 */ [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

满足条件时是不是可以在 GLSL 着色器中回调 C/C++ 函数/代码? [关闭]

GLSL 计算着色器闪烁块/正方形伪影

在opengl矩形上使用着色器会导致它消失[关闭]

IntelliJ:在选定块周围添加格式化程序:关闭/打开注释

c ++ opengl我如何制作着色器文件并在主cpp中使用它[关闭]

请问vs2013编写C语言 如何添加注释块, 像这样, 就是自动生成注释块?