【问题标题】:Fast lexing during edit-time编辑时的快速词法分析
【发布时间】:2016-07-16 12:25:45
【问题描述】:

我想知道在流行的文本编辑器中使用什么技术来快速 lex 一个巨大的源文件(例如 C++)。

每次编辑文件时重新对整个文档进行词法分析(即添加一些字符)可能很快变得不可行。但这些字符可能会将所有内容(朝向顶部、底部或两者)更改为源文件,就像插入的时候一样

/*

\*

大文件的一半。

是否有运行时词法分析的标准方法?

【问题讨论】:

  • Lexing 速度非常快。你的意思是paraing?
  • @EJP:你的意思是解析吗?
  • 插入一些字符如何改变 lex 向顶部? (至少,比当前的标记更多,它可能成为或不再是关键字)
  • @rici 如果编辑器完全像编译器一样处理标记,则 /* 没有 / 将是无效标记。如果您稍后在文件底部插入 */,则 / 和 */ 之间的所有内容都将成为注释标记。当然,如果您在文本编辑器中输入/*,您希望文本在输入*/ 之前变为绿色,因此文本编辑器的词法分析器不应该与编译器的完全一样。
  • @sepp2k:你的第二句话是。至于第一个,我编写的词法分析器将 /* 到程序末尾的文本视为未终止的注释(这肯定是无效的标记,但属于特定种类,如未终止​​的字符串)。我这样做部分是为了避免无限期的词法分析器回溯,部分是因为面对未终止的注释/字符串的解析恢复过于投机而无法尝试打扰(imo)。但关键是您的第二个观察结果:将字符串和 cmets 着色为鲜红色直到终止的文本编辑器真的很烦人......

标签: parsing compilation compiler-construction language-agnostic


【解决方案1】:

我假设编译器用于对源文件进行 lex 分析的技术相同。

一个好的基于 FSA 的词法分析器(或手写的词法分析器)每个字符只花费几条指令。假设一台笨重的机器需要 5 nS 来执行一条指令(WRT 现代工作站的速度很慢)。如果你有一个百万字符的缓冲区(大约 300,000 行,每行 30 个字符),并且每条指令需要 10 条指令来处理,那么总的词法分析时间是 5000 万 nS = .05 秒。

为什么你认为这是个问题?

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2010-10-17
    相关资源
    最近更新 更多