parsing - 是否有在您键入时解析的解析器?

标签 parsing dynamic ide computer-science concept

上下文:

当我了解解析器时,编译代码(比如 C++)的过程是这样解释的:

  1. 在文件中编写代码并保存。
  2. 将文件放入编译器。
  3. 编译器首先将代码解析成抽象语法树,
  4. 然后生成机器码。
  5. 运行代码进行测试。
  6. 重复。

Bret Victor 想要一种在您键入时评估代码的编程环境。 ( http://worrydream.com/#!/InventingOnPrinciple )

我想他不是第一个,将这个概念转化为 2D 游戏编程以外的通用编程可能存在一些概念性问题,而且我知道有些系统已经在做类似的事情:例如电子表格(如 Excel)、Smalltalk。

那不是我想讨论的。


问题:(有点宽泛,抱歉 - 主要问题是粗体)

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

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

<强>1。这是一个合理的概念吗?(对于任何晦涩的编程语言/环境。可能是“功能性 react ”。或者只是 html。)

(2.) 它甚至可能被使用了吗?

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

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

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

最佳答案

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

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

像 vim 和 emacs 这样的文本编辑器会在每次击键时重新解析,但它们通过在行尾缓存上下文(通常)进行优化,因此只对少数字符进行重新解析。 (当然,他们不做完整的解析,所以更容易。)

已经对抽象语法树的增量解析和就地编辑进行了一些研究,但结果变得非常棘手。一种自然适合这种风格的解析策略是“packrat 解析”(可获得大量引用书目 here)。

众所周知,C++ 很难正确解析。事实上,要弄清楚给定的 < 是否存在并非易事。是模板括号或小于号;通常,如果不阅读所有头文件,您将无法做到这一点,并且在某些情况下,如果不实例化模板,您将无法弄清楚;以交互方式完成的工作量太大了。许多其他语言更容易解析,并且定期重新解析的简单解决方案对于所有实际目的来说都足够快。

希望这能解决您的大部分问题。

关于parsing - 是否有在您键入时解析的解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14667969/

相关文章:

c++ - 在字段中用逗号解析 csv

c# - 获取声明为动态的对象的类型

matlab - 跳转到方法定义,不管它是在哪个类中定义的

eclipse - 应用补丁来修复 Eclipse 中的错误?

ide - PyCharm 拼写检查 : how to remove a word (mistakenly) added to the dictionary?

c# - MTOM - 在 VS 2010 中读取时遇到无效的 MIME 内容类型 header

linux - 函数中的命令不能像在终端中手动输入那样工作

python - 类型错误 : 'LazyImporter' object is not callable

android - 可下载的 Android 应用程序主题

c++ - 为什么在C++中我无法使用参数化构造函数声明动态对象数组?