将C样/ *注释块着色的算法* /

时间:2014-12-11 11:07:31

标签: c algorithm parsing semantics

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

其数据结构如下:

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()应该添加和维护哪些额外数据才能有效地执行此操作?

重要细节:

/**/令牌如果在//评论后或""''文字字符串中出现,则不应生效。

我没有要求提供有效的源代码或详细的规格,我只是要求一个简短的概念。

1 个答案:

答案 0 :(得分:2)

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

您的解析器引擎具有状态。你必须知道你是在文字字符串内还是像评论一样的C等。

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

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