【问题标题】:What is a random-logic lexical scanner and what is tree-walking code generator?什么是随机逻辑词法扫描器,什么是 tree-walking 代码生成器?
【发布时间】:2015-02-07 04:20:49
【问题描述】:

我正在研究SpiderMonkey 内部结构。它的documentation 说:

编译器包括:随机逻辑而不是表驱动 词法扫描器,一种产生 AST 的递归下降解析器,以及 树遍历代码生成器。

我不知道什么是随机逻辑词法扫描器以及什么是树遍历代码生成器。我搜索了“随机逻辑词法扫描器”和“树遍历代码生成器”,但没有得到任何看起来有希望的东西。我可以得到这些概念的指针吗?

【问题讨论】:

    标签: javascript compiler-construction code-generation lexical-analysis spidermonkey


    【解决方案1】:

    我想他们所说的“随机逻辑词法扫描器”的意思是词法扫描器是由手工(或许多人)构建的,而不是使用基于正则表达式的表驱动的词法扫描器生成器,例如 @ 987654323@。据推测,这个词是按照hacker lexicon 使用的,可能是接受 4(不连贯、不优雅、杂乱无章)[“该程序有一组随机的错误特征。” “这是该函数的随机名称。”] 我将避免进一步的编辑评论。

    Tree-walking 是代码生成中非常标准的工具,尽管从自动生成的 tree walker 构建的意义上来说,很少有编译器是“纯粹的”,而且大多数严肃的编译器会不止一次地遍历树。虽然像 Lua 这样的简单语言可以在解析期间直接编译,但对于大多数语言来说,首先需要构建一个抽象语法树 (AST),然后在树上进行一次或多次遍历。 (注意:该短语中的“抽象”限定了“语法”这个词,而不是“树”这个词。AST 非常具体。英语有时会令人讨厌地模棱两可。)

    例如,查看 LLVM 文档以获取许多树遍历示例。此外,ANTLR 将自动生成树,并且已经有许多尝试使用 ANTLR 自动或系统化代码生成;一个例子(我没有读过,所以不能认可或批评)是 AJ Admiraal 的硕士论文"Automated ANTLR Tree walker Generation",我之所以提到它只是因为它是谷歌搜索“tree-walking code-”的大量点击中的第一个。一代”。

    【讨论】:

    • 是的。 JavaScript 没有常规的词法语法,因此大多数解析器要么是无扫描仪,要么是手写的,因此解析器会向词法分析器提供提示,或者在 /(除法运算符与正则表达式文字)和嵌套模板字符串周围不正确。
    • @MikeSamuel:更不用说自动分号插入规则了。当然,JS 不幸地需要词法扫描和解析之间的耦合,但它可以作为 flex/bison 解决方案的一部分被隔离并(正确地)实现。模板解析需要递归扫描/解析,但使用 flex/bison 并不比没有更难。当然,事情是可能的这一事实并不意味着它是强制性的(甚至是简单的),正如我之前所说,我试图避免在这里发表编辑评论。
    • 分号插入可以完全在解析器级别处理,只要解析器可以访问行终止符和等效令牌(/**...*/ 带有嵌入的行终止符)和一个非空格注释标记前瞻。
    • @MikeSamuel:当然,但这是扫描仪-解析器互连的另一种情况,因为通常解析器不需要对原始字符进行任何访问。我通常通过在每个标记中包含一点(或位置信息)来做到这一点,这使得解析器可以知道两个连续的标记是否在同一行上。也可以对是否开始行的标记使用不同的标记类型,但恕我直言,语法复杂化是不值得的。类似地,您可以传递行终止符标记,然后基本上忽略它们,但这会使语法更难阅读。
    • 我想我明白了。重申一下:虽然它可以在解析器中完成,但将标记流折叠为具有元信息的标记可能更简单,这让解析器可以识别分号所在的位置;而不是像statement := expression (ignorables semi | negative_lookahead(ignorables (line_terminator | multiline-comment) ignorables (infix_operator | postfix_op | ...))中那样通过显式匹配“可忽略”标记来使语法复杂化@
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2023-01-03
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多