为类 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++ 函数/代码? [关闭]
IntelliJ:在选定块周围添加格式化程序:关闭/打开注释