我想知道高级文本编辑器的功能,如文本突出显示,代码完成,自动缩进等。
为了使我的想法清晰,我想文本突出显示是将整个文本读成字符串,然后使用关键字+颜色代码进行正则表达式替换关键字并再次替换文本。这看起来合乎逻辑,但是如果您的文件是4000行,那么每次按键操作都会非常低效!所以我想知道在C#中实现这样的事情的想法(例如,任何其他语言都可以,但这就是我现在正在尝试的)。
答案 0 :(得分:1)
语法突出显示: 我想起了This。我还没有尝试过这个例子,所以我不能说出性能,但它似乎是让基本语法高亮显示并运行的最简单方法。
自动完成:强> 给定可能的关键字列表(可以根据上下文进行过滤),您可以快速丢弃与用户当前键入的内容不匹配的任何内容。在大多数语言中,您可以安全地将自己限制为一个“单词”,因为空格在标识符中通常不合法。例如,如果我开始键入“li”,则自动完成数据库可以丢弃任何不以字母“l”和“i”(忽略大小写)开头的内容。随着用户继续键入,可以丢弃越来越多的选项,直到只剩下一个 - 或至少几个 - 。既然你一次只看一个单词,那确实非常快。
<强>压痕:强>
一种快速而肮脏的方法(类似)在类C语言中工作就是有一个计数器,你可以为每个'{'增加一次,并为每个'}减少一次。当您按Enter键开始换行时,缩进级别为counter * indentWidth
,其中indentWidth
是要缩进的常量空格或制表符。但是,这有一个严重的缺点 - 考虑以下因素:
if(foo)
bar(); // This line should be indented, but how does the computer know?
要处理这个问题,你可能会寻找以')'结尾的行,而不是分号。
答案 1 :(得分:1)
编辑器内部的一个旧的,但仍然适用的资源是The Craft of Text Editing。第7章直接解决了重新显示策略的问题。
答案 2 :(得分:1)
为了进行“高级”语法突出显示 - 即突出显示需要上下文知识的内容,通常需要解析器。大多数解析器都是基于某种formal grammar构建的,它存在各种变体:LL,LALR和LR很常见。
但是,大多数解析器都对整个文件进行操作,这对文本编辑来说效率很低,因此我们转向incremental parsers。增量解析器使用语言知识和先前已处理的结构,以便尽可能少地完成工作。
以下是对增量解析的一些参考: