Parsing 是否有解析器在您键入时进行解析?

Parsing 是否有解析器在您键入时进行解析?,parsing,dynamic,ide,computer-science,concept,Parsing,Dynamic,Ide,Computer Science,Concept,背景: 当我学习解析器时,编译代码(比如C++)的过程解释如下: 将代码写入文件并保存 将文件放入编译器中 编译器首先将代码解析为抽象语法树 然后生成机器代码 运行代码来测试它 重复一遍 Bret Victor需要一种编程环境,在您键入代码时对代码进行评估。() 我猜他不是第一个,在2D游戏编程之外,将这个概念转化为通用编程可能会有一些概念上的问题,而且我知道有些系统已经做了类似的事情:例如preadsheets(如Excel)、Smalltalk 这不是我想讨论的 问题:(有点宽泛,对不起-

背景:

当我学习解析器时,编译代码(比如C++)的过程解释如下:

  • 将代码写入文件并保存
  • 将文件放入编译器中
  • 编译器首先将代码解析为抽象语法树
  • 然后生成机器代码
  • 运行代码来测试它
  • 重复一遍
  • Bret Victor需要一种编程环境,在您键入代码时对代码进行评估。()

    我猜他不是第一个,在2D游戏编程之外,将这个概念转化为通用编程可能会有一些概念上的问题,而且我知道有些系统已经做了类似的事情:例如preadsheets(如Excel)、Smalltalk

    这不是我想讨论的


    问题:(有点宽泛,对不起-主要问题是粗体的)

    如何在编辑时解析文本? 我的想法是,每当编辑器发送一个事件指示文本的某些部分被更改时,只有AST的一部分得到重新评估,受AST这一部分影响的值也得到重新评估

    我曾考虑编写一个解析器生成器,它像往常一样采用语法,但生成一个解析器来处理文本的增量更改,而不是整个文本

    1。这是一个合理的概念吗?(适用于任何晦涩难懂的编程语言/环境。可能是某种“功能性反应”,或者只是html。)

    (2)它可能已经被使用了吗

    (3.)解析整个文件的速度是否足以使复杂的方法变得不必要

    (4.)像Eclipse这样的IDE中的语法高亮器或类型检查器是这样工作的吗?它们是如何工作的?我认为它们没有编译器解析器那么强大,无法让它们足够快地工作,是吗

    (5.)Stackoverflow中有样式文本的实时预览。它是否在每次击键后解析整个问题?“我的”概念会解决一些限制吗?

    制表符完成(或“智能感知”)需要非常类似于解析的东西,以便找出什么是合理的完成/遵循。您可能在某些IDE中对此有一些经验。如果是这样,您也会注意到它的一些局限性

    像SO的预览功能这样的系统会定期解析输入,但不一定每次击键都会解析。您可能会注意到语法突出显示有点滞后,特别是当缓冲区已满时。一个典型的策略是使用一个进程,该进程重复地重新解析,直到在解析过程中输入没有更改,然后等待下一个更改

    像vim和emacs这样的文本编辑器在每次击键时都会重新分析,但它们通过在行尾缓存上下文(通常)进行优化,因此重新分析只针对几个字符。(当然,它们不会进行完整的解析,因此更简单。)

    有人对增量解析和抽象语法树的就地编辑进行了一些研究,但这变得相当棘手。一种自然适合这种风格的解析策略是“packrat解析”(有大量的参考书目)


    众所周知,C++很难正确解析。事实上,弄清楚一个给定的
    是否绝对是一个有趣的问题是非常重要的。我使用的解析器与您在我的GoWorks演示IDE中描述的有点类似。下面是一段视频,展示了解析器的运行(从5分钟开始):

    解析器不会每次都解析整个文件,因为所需的解析信息只能从输入的子集派生。除此之外,解析还有几个缺点,包括以下主要项

  • 如果解析文件中不必要的部分,并且这些部分包含语法错误(用户正在积极编辑时的常见情况),则解析器可能无法准确地从错误中恢复
  • 解析过多的信息,即使速度足够快,让用户看起来“流畅”,也会对移动中的用户的电池寿命产生重大影响

  • 据我所知,我们最新的IDE是唯一一个积极使用特定风格的解析器的IDE(这是您描述的IDE中使用的解析器的一个非常特定的子集),作为多种语言的通用方法。

    主要通过以下两种方式之一完成:

    • 使用一个简单得多的原始解析器,它只包含足够的颜色信息。速度足够快,因为它很简单,可能会被复杂的语言特性绊倒
    • 在AST中输入位置信息,然后修复树。如果你保留一些历史记录,你可以避免将当前错误后的所有内容都标记为错误
    Smalltalk当然一次只解析一个方法。这使得解决方案更快、更简单,错误的解释也就更少了。键入时重新分析可能会受到限制。只要一个标识符没有被识别,在它之后重新划分零件就没有多大意义

    很久以前,有一个用于mac的think pascal编译器(也是一个c编译器),它工作得非常好