我有一个简单的文本编辑器。我想为它添加一个类似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()
应该添加和维护哪些额外数据才能有效地执行此操作?重要细节:
/*
和*/
令牌如果在//
评论后或""
和''
文字字符串中出现,则不应生效。
我没有要求提供有效的源代码或详细的规格,我只是要求一个简短的概念。
答案 0 :(得分:2)
首先请注意C支持多行字符串,所以你已经遇到了这个问题,只是没有解决它。
您的解析器引擎具有状态。你必须知道你是在文字字符串内还是像评论一样的C等。
将此状态存储为每行的起始位置。这样解析器就可以从中断的地方继续。 如果下一行的新状态与旧状态不同,则必须继续解析,否则可以停止。
通过控制此类状态快照的频率(例如:仅存储每10行一次),您可以控制速度和内存占用之间的权衡。