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

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

3天内不再提示

Stanford编译的原理是什么?

处理器与AI芯片 来源:处理器与AI芯片 2023-09-02 09:55 次阅读

第一个作业是根据这门课定义的cool语言,写一个词法分析的rule,词法分析对我帮助不大,主要是理解使用就可以,就大部分参照github上的实现了。

Workflow

1)cool/include/PA2/cool-parse.h 里面定义了需要处理的关键字

/* Tokens.  */
#define CLASS 258
#define ELSE 259
#define FI 260
#define IF 261
#define IN 262
#define INHERITS 263
....

2) 实验的主要内容是在cool.flex中增加对关键字,注释,嵌入注释,字符串的处理。在cool.flex内部定义好规则时候,make flexer 时,会调用flex. flex 输入cool.flex, 输出cool-lex.cc,这个就是flex自动产生的处理词法的代码。

3)产生flex后,可以调用perl pa1-grading.pl,打分会报告哪些没有处理好

4)没有处理好的

c53e8d20-48b6-11ee-97a6-92fbcf53809c.png

对于这种,可以直接grep “line number test 2”,查看时那个文件没有处理好。./grading 目录下有一堆输入文件

c558845a-48b6-11ee-97a6-92fbcf53809c.png

可以直接调用 ./lexer ./gool.cool 或者出错的文件 ./lexer ./lineno2.cool

它会根据我们输入的规则,print信息

c57296f6-48b6-11ee-97a6-92fbcf53809c.png

我的问题是注释里面遇到换行,没有增加linenumber,在comment里面加上遇到换行符时,递增linenumber就对了。

上面是环境的问题,下面是除了课程的资料以外需要了解的内容。

背景知识

遇到的问题我就直接问chatgpt了。

1)Flex支持的函数:

yymore(): As mentioned earlier, this function is used to accumulate text from multiple rule matches before taking action. It’s particularly useful when you want to combine consecutive matches into a single token.

yytext: As discussed before, this global variable holds the current matched text or lexeme. It’s automatically populated by Flex based on the pattern that matches.

yylineno: This global variable keeps track of the current line number being processed by the lexer. You can use it to maintain accurate line number information for error reporting or other purposes.

我列出了主要用的,主要用的还是yymore(),用来继续处理token的内容;另一个就是yytext 则是表示当前匹配的内容。这里主要是讲数字,字符串以及自定义的object与符号表中的内容连接起来。


c5ac864a-48b6-11ee-97a6-92fbcf53809c.png

2) 如何编写cool.flex

对于关键字的支持比较简单,主要还是支持字符串和注释,以及嵌套注释。

这里就是状态机,初始时和正常状态下都处于INITIAL状态,cool语言时的注释以(*开头,考虑到会存在嵌套注释,因此在INITIAL,COMMENTS,INLINE_COMMENTS三种状态下,都可能会遇到(*此时我们进入COMMENTS状态,因此BEGIN COMMENTS。

"(*" {
    comment_layer++;
    BEGIN COMMENTS;
}

在注释中,遇到非特殊字符,不需要特殊处理,可以直接忽视,因此{}内部都为空。

[^n(*]* { }

[()*] { }

在遇到换行符时,增加行数计数。


 {
    curr_lineno++;
}

这里的comment_layer–与上面的comment_layer++对应,进入comment时递增,出comment递减,主要是为了应对嵌套注释。在走到最外层时,回到INITIAL状态。

"*)" {
    comment_layer--;
    if (comment_layer == 0) {
        BEGIN INITIAL;
    }
}

总结来说, 就是下面的这个规则

DEFINED STATE {
Action
}





审核编辑:刘清

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

    关注

    68

    文章

    19168

    浏览量

    229153
  • 字符串
    +关注

    关注

    1

    文章

    577

    浏览量

    20485
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27478

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

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

收藏 人收藏

    评论

    相关推荐

    浅析可提升Vivado编译效率的增量编译方法

    增量编译:使用增量编译满足最后时刻 HDL 变动需求,仅针对已变动逻辑进行布局布线,从而可节省时间。
    的头像 发表于 12-13 10:14 5338次阅读

    一文详解编译系统

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

    如何让OpenHarmony编译速度“狂飙”

    OpenHarmony 有两种编译方式,一种是通过 hb 工具编译,一种是通过 build.sh 脚本编译。本文笔者将提升 build.sh 方式编译速度的方法整理分享给大家。
    的头像 发表于 02-14 09:31 1876次阅读

    Stanford编译原理详解

    第二部分的作业是语法分析,通过编写cool.y(这个assignment的任务),利用bison将其自动生成语法分析LALR(1)的代码。
    的头像 发表于 10-25 10:47 652次阅读
    <b class='flag-5'>Stanford</b><b class='flag-5'>编译</b>原理详解

    [1.1.1]--什么是编译原理

    编译原理
    jf_60701476
    发布于 :2022年12月27日 10:57:13

    GAL编译工具

    GAL编译工具 Atmel提供的GAL编译工具 4.8a版本
    发表于 04-14 15:42 83次下载

    PCM编译码实验

    PCM编译码实验 一、实验目的1. 掌握PCM编译
    发表于 10-21 13:35 9047次阅读
    PCM<b class='flag-5'>编译</b>码实验

    QT/E和Qtopia的编译详解

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

    谁能缩短大容量FPGA的编译时间?增量式编译QIC!

    增量式编译(Incremental Compilation)是ALTERA为解决大容量FPGA设计编译时间太长的问题给出的一个新式工具!在本文中我们将阐述QIC在缩短编译时间方面的作用。
    发表于 12-25 11:26 4929次阅读

    Keil编译常见问题

    吴鉴鹰总结的Keil 编译常见问题,吴鉴鹰总结的Keil 编译常见问题。
    发表于 07-22 15:31 10次下载

    讲述增量编译方法,提高Vivado编译效率

    当RTL代码修改较少时,使用增量编译功能可以提高工程的编译速度,Incremental Compile增量编译是Vivado提供的一项高阶功能。目的旨在当设计微小的改变时,重用综合和布局布线的结果,缩短
    的头像 发表于 01-22 17:27 1w次阅读
    讲述增量<b class='flag-5'>编译</b>方法,提高Vivado<b class='flag-5'>编译</b>效率

    什么是预编译

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

    交叉编译器安装教程

    交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。Ubuntu 自带的 gcc 编译器是针对 X86 架构的,而我们现在要编译的是 ARM
    的头像 发表于 09-29 09:12 3448次阅读

    Linux内核编译脚本

    获得编译命令及选项 编译linux时,默认不会显示编译的命令,如果你要获得编译命令及其选项,可以在make命令后面加上宏定义: make V= 1 如果希望
    的头像 发表于 09-27 11:52 612次阅读

    3568编译环境搭建

    主要介绍如何在本地搭建编译环境来编译rockchipBBuildrootllinuxSDK的源代码。d当前sdk只支持在linux环境下编译,并提供linux的交叉编译工具。
    发表于 12-13 11:23 18次下载