0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Stanford编译原理详解

处理器与AI芯片 来源:处理器与AI芯片 2023-10-25 10:47 次阅读

第二部分的作业是语法分析,通过编写cool.y(这个assignment的任务),利用bison将其自动生成语法分析LALR(1)的代码。

语法分析,就是将词法分析阶段已经识别好的token,按照语法的规则,构建抽象语法树的过程。

比如以下的代码:

x=(a+b)*(c-d);

可以构成下图的抽象语法树:

        =
       / 
      x   *
         / 
        +   -
       /  / 
abcd

具体在cool.y 中,

b1d10848-72dd-11ee-939d-92fbcf53809c.png

这部分定义了非终结符non-terminal对应的semanticvalue. Union中的每一个field都可以是parsing动作的结果。

在stanfordcompiler的教学语言cool中,这就对应了AST的一个node。每一个non-terminal,都有其对应的semanticvalue。

左侧的各种类型在cool-tree.aps中都有对应定义,比如Features:

b1f78f4a-72dd-11ee-939d-92fbcf53809c.png

Feature即为class中的成员函数或者成员变量。因为可以有多个Feature,所以存在Features,即LIST[Feature].

下面则具体定义了所有的非终结符对应的AST节点类型。<>内部的,比如classes是在union中定义的value,而右侧的,比如class_list,我们需要定义规约该非终结符时,需要进行的操作。

b219db4a-72dd-11ee-939d-92fbcf53809c.png

上图中$$即为action的返回值,对应该抽象语法树AST对应的node。

下面介绍如何声明非终结符对应的规约操作。

b243dc06-72dd-11ee-939d-92fbcf53809c.png

具体如何对类的声明构建抽象语法树节点,即class的规则:

1)

CLASS TYPEID '{' feature_list '}' ';'
{
/*对应动作 action*/
  $$=class_($2,
  idtable.add_string("Object"),
  $4,
  stringtable.add_string(curr_filename));
}

其动作对应cool-tree.aps中生命的constructor,

b25be4e0-72dd-11ee-939d-92fbcf53809c.png

传给class_的参数即为

1)类名称 2)父类名称 3)成员变量/成员函数

4)文件名

对应的位置如类名称即为TYPEID,对应$2, feature_list对应$4,因此其动作action写成了如上图所示的样子。

cool语法中,如果class类没有继承自其他类,那么默认继承自Object类型,因此parent设置为Object。

2)

CLASS TYPEID INHERITS TYPEID '{' feature_list '}' ';'
{$$=class_($2,$4,$6,
stringtable.add_string(curr_filename));}

这里唯一不同的即为该类继承自父类,因此其第2个参数,父类名称传入了$4。具体的序号可以参考第205行的注释。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4245

    浏览量

    62070
  • 代码
    +关注

    关注

    30

    文章

    4678

    浏览量

    67891
  • 编译
    +关注

    关注

    0

    文章

    646

    浏览量

    32694

原文标题:Stanford 编译原理 编程作业2

文章出处:【微信号:处理器与AI芯片,微信公众号:处理器与AI芯片】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一文详解编译系统

    什么是编译器?为什么要有编译器?编译器的作用是什么?编译系统的组成部分有哪些,它们之间的关系是什么?有一句名言说的非常好:了解一件事情最好从它的历史开始。要想对整个
    发表于 09-20 09:09 1302次阅读

    嵌入式开发中的交叉编译详解

    在嵌入式开发中,经常会遇到目标平台资源贫乏,无法运行需要的编译器。亦或是目标平台上不允许或不能够安装需要的编译器。这时候就需要使用交叉编译了。
    的头像 发表于 12-01 13:24 980次阅读
    嵌入式开发中的交叉<b class='flag-5'>编译</b><b class='flag-5'>详解</b>

    gcc编译出错

    1、信息说明 硬件平台:JZ24402、问题现象 1) 第005节_Makefile的引入及规则_P test无法编译编译如下 2) gcc编译器1_gcc常用选项__gcc编译过程
    发表于 04-01 07:45

    WinCE系统的编译过程详解

    在WinCE系统中,当我们完成了相关的开发和系统定制工作以后,会编译WinCE系统,最后生成NK.bin和NK.nb0。我现在用WinCE6.0在自己的PC上面编译一次用时19分16秒(有一天无聊,就测了一下)
    发表于 07-20 11:52 1898次阅读
    WinCE系统的<b class='flag-5'>编译</b>过程<b class='flag-5'>详解</b>

    QT/E和Qtopia的编译详解

    首先说说编译PC上的QT/E,我起初的时候不知道编译PC上的QT/E编译qpe和交叉编译后的qpe有什么不同,
    发表于 05-10 10:53 2797次阅读

    PICC编译器的库函数详解

    本章将详细列出PICC编译器的库函数。每个函数均从函数名开始,然后按照以下几个标题给出详细解释。
    发表于 10-14 14:17 0次下载

    Vivado中的Incremental Compile增量编译技术详解

    Incremental Compile增量编译是Vivado提供的一项高阶功能。目的旨在当设计微小的改变时,重用综合和布局布线的结果,缩短编译时间。
    的头像 发表于 07-05 06:06 1.1w次阅读

    Linux内核编译过程详解

    Linux内核编译过程详解(kernel2.6.7) 花了几天才编译成功kernel2.6.7,其过程真可谓艰辛。古语有云:苦尽甘来!现在终于可以乐上一阵了。由于许多朋友对操作的顺序及某些重要的配置
    发表于 11-07 11:16 4次下载

    编译器是如何工作的_编译器的工作过程详解

    随着计算机的发展,编译器已经发挥着十分重要的作用。本文主要介绍了编译器的种类、编译器的工作原理以及编译器工作的具体操作过程及步骤详解
    发表于 12-19 12:54 1.6w次阅读

    Prelink的交叉编译和使用详解

    Prelink的交叉编译和使用详解
    的头像 发表于 06-20 12:03 3407次阅读
    Prelink的交叉<b class='flag-5'>编译</b>和使用<b class='flag-5'>详解</b>

    Php+mysql+apache编译安装详述

    Php+mysql+apache编译安装详述(深圳市核达中远通电源技术股份有限公司大吗)-文档为Php+mysql+apache编译安装详述详解文档,是一份不错的参考资料,感兴趣的可以下载看看,,,,,,,,,,,,,,,
    发表于 09-18 14:42 2次下载
    Php+mysql+apache<b class='flag-5'>编译</b>安装详述

    详解OpenHarmony的编译和烧录

    在上一篇【博流 BL-HWC-G1 开发板试用】开箱及编译烧录官方程序(BL602 IoT SDK)中,我们讲了这块开发板使用官方SDK进行编译烧录,这一篇,我们来讲OpenHarmony的编译
    的头像 发表于 11-08 09:58 5246次阅读
    <b class='flag-5'>详解</b>OpenHarmony的<b class='flag-5'>编译</b>和烧录

    什么是预编译

    编译就是处理以#开头的指令,比如赋值#include包含的文件、#define宏定义的替换、条件编译等。预编译就是为编译前做准备工作的阶段,主要处理以#开头的预
    发表于 01-13 13:52 0次下载
    什么是预<b class='flag-5'>编译</b>

    C语言中条件编译详解

    —般情况下,C语言源程序中的每一行代码.都要参加编译。但有时候出于对程序代码优化的考虑,希望只对其中一部分内容进行编译。此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译
    的头像 发表于 04-14 13:12 2922次阅读

    Stanford编译的原理是什么?

    第一个作业是根据这门课定义的cool语言,写一个词法分析的rule,词法分析对我帮助不大,主要是理解使用就可以,就大部分参照github上的实现了。
    的头像 发表于 09-02 09:55 515次阅读
    <b class='flag-5'>Stanford</b><b class='flag-5'>编译</b>的原理是什么?