【问题标题】:Algorithm to colorize C-like /* comment blocks */ [closed]为类 C 着色的算法 /* 注释块 */ [关闭]
【发布时间】: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 你总是应该就一个问题展示你自己的研究成果,即使它不成功

标签: c algorithm parsing semantics


【解决方案1】:

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

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

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

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

【讨论】:

  • 好一个,这是否可以在重新解析修改块后以某种方式检测到何时停止解析?我真的不想重新解析直到文件结束。这足以检查以前的解析状态是否与当前解析器相同?
  • 是的。我已经在答案中告诉了这一点。
  • 这是一个绝妙的答案!节省了我大量尝试其他事情的时间并提供了最佳性能,它易于维护并且对额外存储的需求非常低。
猜你喜欢
  • 2016-08-03
  • 2018-05-22
  • 2016-07-05
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2010-10-24
相关资源
最近更新 更多