Standford Compiler Course Assignment 1

news2025/1/12 23:08:04

第一个作业是写一个词法分析的rule,词法分析对我帮助不大,主要是理解使用就可以,就大部分参照github上的实现了。
实验需要注意的内容:
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
....
  1. 实验的主要内容是在cool.flex中增加对关键字,注释,嵌入注释,字符串的处理。在cool.flex内部定义好规则时候,make flexer 时,会调用flex. flex 输入cool.flex, 输出cool-lex.cc,这个就是flex自动产生的处理词法的代码。

3)产生flex后,可以调用perl pa1-grading.pl,打分会报告哪些没有处理好
4)没有处理好的
在这里插入图片描述
对于这种,可以直接grep “line number test 2”,查看时那个文件没有处理好。./grading 目录下有一堆输入文件

在这里插入图片描述

可以直接调用 ./lexer ./gool.cool 或者出错的文件 ./lexer ./lineno2.cool
它会根据我们输入的规则,print信息。
在这里插入图片描述

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

上面是环境的问题,下面是除了课程的资料以外需要的了解的内容,遇到的问题我就直接问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.

These are some of the key functions and features that you’ll encounter while using Flex to build lexical analyzers. Remember that Flex provides a set of tools and features to make it easier to write lexical rules and integrate the lexer into your larger compiler or parsing system.

我列出了主要用的,主要用的还是yymore(),用来继续处理token的内容; 另一个就是yytext 则是表示当前匹配的内容。这里主要是讲数字,字符串以及自定义的object与符号表中的内容连接起来。
在这里插入图片描述
2) 如何编写cool.flex
对于关键字的支持比较简单,主要还是支持字符串和注释,以及嵌套注释。
这里就是状态机,初始时和正常状态下都处于INITIAL状态,cool语言时的注释以"( *" 开头,考虑到会存在嵌套注释,因此在INITIAL,COMMENTS,INLINE_COMMENTS三种状态下,都可能会遇到 "( * " 此时我们进入COMMENTS状态,因此BEGIN COMMENTS。

<INITIAL,COMMENTS,INLINE_COMMENTS>"(*" {
    comment_layer++;
    BEGIN COMMENTS;
}

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

<COMMENT>[^\n(*]* { }

<COMMENT>[()*] { }

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


<COMMENT>\n {
    curr_lineno++;
}

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


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

github路径:https://github.com/hitqshao/stanford-compilers-coursework.git
这个仓库我fork了https://github.com/gboduljak/stanford-compilers-coursework.git, 对应修改的代码在./assignments/PA/cool.flex.
​​​​​​
​​在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/961361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基本介绍——数据挖掘

1.数据挖掘的定义 数据挖掘是采用数学的、统计的、人工智能和神经网络等领域的科学方法&#xff0c;如记忆推理、聚类分析、关联分析、决策树、神经网络、基因算法等技术&#xff0c;从大量数据中挖掘出隐含的、先前未知的、对决策有潜在价值的关系、模式和趋势&#xff0c;并…

新款奥迪 A7L 正式上市,媒介盒子多家媒体助阵

新款奥迪 A7L 正式上市&#xff0c;媒介盒子多家媒体助阵&#xff01; 哈喽,大家好,今天媒介盒子小编又来跟大家分享媒体推广的干货知识了,本篇分享的主要内容是:新车上市,上汽奥迪A7L的营销策略。 新款奥迪 A7L 正式上市&#xff0c;新车推出 11 款车型&#xff0c;售价为 4…

探索云原生容器编排技术:如Kubernetes如何为大数据处理和AI模型的自动化部署带来便利

文章目录 1. 弹性伸缩2. 容器化3. 自动化部署4. 存储管理5. 服务发现和负载均衡6. 监控和日志记录7. 多云支持8. 多版本管理9. 安全性和隔离10. 社区支持和生态系统 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点…

部署java程序的服务器cpu过高如何排查和解决

1.top命令找到占用CPU高的Java进程PID 2.根据进程ID找到占用CPU高的线程 ps -mp pid -o THREAD,tid | sort -r ps -mp 124682 -o THREAD,tid | sort -r 3.将指定的线程ID输出为16进制格式 printf “%x\n” tid printf "%x\n" 6384 18f0 4.jstack pid |…

C++中基类和派生类的析构函数

和构造函数类似&#xff0c;析构函数也不能被继承。与构造函数不同的是&#xff0c;在派生类的析构函数中不用显式地调用基类的析构函数&#xff0c;因为每个类只有一个析构函数&#xff0c;编译器知道如何选择&#xff0c;无需程序员干涉。 另外析构函数的执行顺序和构造函数的…

分类算法系列④:朴素贝叶斯算法

目录 1、贝叶斯算法 2、朴素贝叶斯算法 3、先验概率和后验概率 4、⭐机器学习中的贝叶斯公式 5、文章分类中的贝叶斯 6、拉普拉斯平滑系数 6.1、介绍 6.2、公式 7、API 8、示例 8.1、分析 8.2、代码 8.3、⭐预测流程分析 &#x1f343;作者介绍&#xff1a;准大三…

Modelsim查看断言

断言编译modelsim 在modelsim中开启断言编译和显示功能&#xff1a; 【编译verilog代码时按照system verilog进行编译】 vlog -sv abc.v 或者使用通配符编译所有的.v或者.sv文件 &#xff08; vlog -sv *.sv *.v&#xff09; 【仿真命令加一个-assertdebug】 vsim -a…

华为云服务

【计算】 【存储】 对象存储服务 OBS 对象存储服务&#xff08;Object Storage Service&#xff0c;OBS&#xff09;是一个基于对象的海量存储服务&#xff0c;为客户提供海量、安全、高可靠、低成本的数据存储能力。 OBS系统和单个桶都没有总数据容量和对象/文件数量的限制…

视频文件损坏无法播放如何修复?导致视频文件损坏的原因

如果我们遇到因视频文件损坏而无法正常播放&#xff0c;我们该怎么办&#xff1f;这种情况通常意味着视频文件已经损坏。我们不能访问、编辑或使用它们。那么应该用什么正确的工具和修复程序来修复视频呢&#xff1f; 视频文件损坏的原因 了解视频损坏如何修复之前&#xff0c…

【板栗糖GIS】——360浏览器如何安装微信读书插件

目录 1. 下载插件 ​2. 解压edge插件 3. 点击360浏览器的插件管理 4. 加载已解压的扩展程序 前情提示&#xff1a;不要从任务栏打开360浏览器&#xff0c;要从桌面快捷键打开 1. 下载插件 截止到2023年9月1日&#xff0c;github提供的为0.03版本&#xff0c;下载后会得到…

AP51656 LED车灯电源驱动IC 兼容替代PT4115 PT4205 PWM和线性调光

产品描述 AP51656是一款连续电感电流导通模式的降压恒流源 用于驱动一颗或多颗串联LED 输入电压范围从 5V 到 60V&#xff0c;输出电流 可达 1.5A 。根据不同的输入电压和 外部器件&#xff0c; 可以驱动高达数十瓦的 LED。 内置功率开关&#xff0c;采用高端电流采样设置 …

ThingsKit物联网平台告警中心之告警记录

概述 当设备达到预先指定的阈值时&#xff0c;平台会自动产生告警&#xff0c;可以通过告警记录及时查看详细的告警信息以及对告警进行处理和反馈。 详情 场景联动中设备产生的告警记录详情。 :::info &#x1f4a1; 提示 告警记录状态&#xff1a;激活未确认、激活已确认、…

使用 Amazon SageMaker 的生成式 AI 定制个性化头像

生成式 AI 已经成为各行业创意过程增强和加速的常用工具,包括娱乐、广告和平面设计。它可以为观众创造更个性化的体验,并提高最终产品的整体质量。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮…

【STM32】学习笔记(串口通信)

串口通信 通信接口硬件电路电平标准USARTUSART框图 通信接口 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信&#…

liunx下ubuntu基础知识学习记录

使用乌班图 命令安装使用安装网络相关工具安装dstat抓包工具需要在Ubuntu内安装openssh-server gcc安装vim安装hello word输出1. 首先安装gcc 安装这个就可以把gcc g一起安装2. 安装VIM3.编译运行代码 解决ubuntu与主机不能粘贴复制 命令安装使用 安装网络相关工具 使用ifconf…

wandb安装方法及本地部署教程

文章目录 1 wandb介绍2 wandb安装2.1 注册wandb账号2.2 创建项目并获得密钥2.3 安装wandb并登录 3 wandb本地部署3.1 设置wandb运行模式3.2 云端查看运行数据 4 总结 1 wandb介绍 Wandb&#xff08;Weights & Biases&#xff09;是一个用于跟踪、可视化和协作机器学习实验…

9.GPIO子系统

目录 GPIO1节点 内核设备树新增rgb_led节点&#xff08;使用gpio子系统&#xff09; 常用的对外接口 头文件 of_find_node_by_path()函数 of_get_named_gpio()函数 gpio_request()函数 gpio_free()函数 gpio_direction_output()函数 gpio_direction_input()函数 gpi…

Gradio Auth登录页设置中文

最近入坑了gradio, 就是一款python框架&#xff0c;可以通过简单的几行代码&#xff0c;就能够帮我们构建一个简易的页面网站&#xff0c;并且可以在里面做相应的逻辑处理。目前该框架在AI领域相对比较火爆&#xff0c;用于给自己的大模型构建操作页面。 官网地址&#xff1a;…

离散数据编码方式总结(OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies、DictVector

写在前面 在机器学习的特征选择的时候&#xff0c;往往有一些离散的特征不好计算&#xff0c;此时需要对这些特征进行编码&#xff0c;但是编码方式有很多&#xff0c;不同的包也会有不同的编码方式。&#xff08;明白OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummi…

网络基础之重中之重

目录 IP协议 ​编辑 基本概念&#xff1a; 协议头格式&#xff1a; ​编辑 网段划分 DHCP &#xff1a; CIDR&#xff1a; 特殊的IP地址&#xff1a; IP地址的数量限制&#xff1a; 私有IP和公网IP 路由 路由的过程&#xff1a; 数据链路层 认识以太网&#x…