• 新编译原理的草稿


    经典编译原理似乎已经够用了,为什么要研究新编译原理呢?在四型文法中,只实现了前两型,现在用的编译原理,仍然是“上下文无关文法”。沿着文法产生式替换的思路走下去,很艰难,不如另辟蹊径,于是就有了新编译原理。

    经典编译原理的词法分析阶段,识别出关键词,且关键词只能是关键词,不能是别的。随着语言规模扩大,需要识别的关键词越来越多,恐怕会占用太多的命名空间?在新编译原理中,词法分析阶段仅处理:字符串、转义符、逗号、括号、换行,这五个。

    经典编译原理的语法分析阶段,执行先乘除后加减的优先级策略。这可以成功地分析算数表达式,但是,尤其是汉语,语法规则并不十分严格,用数学的思路来解决语文的问题?在新编译原理中,先分析优先级低的符号,例如换行符,这样一来,源代码被拆分成许多行,每一行再分别处理,实现更复杂的语法。并非全文遵守统一的语法。

    在树结构上进行分析,且词法分析和语法分析使用同一棵树。这样做的一个结果就是:1+2+3+4被处理成(+ 1 2 3 4),有4个分支;经典编译原理中,处理成(((1+2)+3)+4),按优先级和结合性来分析,确实是这样。但在执行字符串相加的操作时,效率降低,因为每次加法都涉及realloc。只能用专门的、另一个函数来替代才可以。这是从经典编译原理的语法分析得来的,且LR(1)特别难,基本上无人敢动。

    新编译原理从优先级低的符号开始,先把源代码拆分成行,再逐行分析。每一行可以使用不同的语法?似乎可以用函数族来代替DFA,而DFA是连成一体的,当用函数族代替后,可以“分而治之”。具体来说,在词法分析阶段,想要修改字符串的定义,就去修改识别字符串的函数。在语法分析阶段,每个句型对应一个分析函数,该函数可以分析语法树的上下文,实现类似于上下文有关文法的效果。

    电路设计的基本原理,是电子开关,即用一束电控制另一束电的通断;新编译原理要做到的,是用一段程序控制另一段程序的分析过程。实现可编程的语法,而不仅是依赖文法符号的简单替换。

    说一说新的语法树。它支持“多重类型”,例如一段代码,它可以既是一段代码,又是一个for语句,二者并不冲突。所以,语法树上,每个节点会有一张两列多行的表。第一列表示key,第二列表示value。看到key-value千万别用哈希表,应该用vector,因为要求类型是有序的。例如,某个对象既是动物类,也是猫类,动物类和猫类之间有继承关系,顺序不能乱,所以必须使用vector而不是哈希表。

    在节点和节点之间,构成树状结构,且经常要访问兄弟节点,以完成上下文有关文法,兄弟节点即上下文。每个节点记录4个指针:父、兄、弟、长子。其中兄弟指针构成一个双链表,而指向孩子的指针指向的是第一个孩子,即长子。

    词法分析过后,形成一棵一个根节点,几百个子节点的扁平的树。然后的语法分析,对树进行“剪切”,形成更深的树结构。例如,把1+2+3+4剪切成一个加法节点,下边有4个数字节点。

    对每个节点应用每个函数,而每个函数先判断节点的状态,再进行操作。如果某个节点已经识别出了“这是一个print语句”,则其他函数对它都不起作用,只有处理print语句的函数发挥作用。这么设计当然会比DFA慢,但几十年间电脑的速度提升了百万倍,慢一点的算法也能应付。

    先写到这里吧,更多内容可以关注我的博客。

  • 相关阅读:
    vue2技能树(11)-路由安装与基本配置、路由导航、嵌套路由
    安信证券携手共议量化行业的赋能发展
    POJ2031空间站题解
    如何构建并提高自己的核心竞争力?
    JWT实现用户token令牌管理
    python笔记Ⅵ--函数、函数的参数
    全国职业技能大赛云计算赛项---Linux系统调优案例
    【刷题小结】多路归并类型
    前端 webpack 面试题
    函数和变量总结
  • 原文地址:https://blog.csdn.net/proorck2019/article/details/128213553