自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 资源 (5)
  • 收藏
  • 关注

原创 动手实现编译器(十七)——局部变量

上一节中,我们已经实现了逻辑运算和负数,在本节中,我们将要实现比较难的局部变量。现在,我们所有的变量对所有函数都是全局可见的。我们想添加一个本地范围对于变量,这样每个函数都有自己的变量,不能被其他函数看到。此外,在递归函数的情况下,同一个函数的每个实例都有自己的局部变量。要为同一函数的多个实例创建本地作用域,为了提供一个地方来存储函数的参数,我们需要一个堆。让我们从局部变量和全局变量之间的区别开始。全局变量必须对所有函数可见,但局部变量只是对一个函数可见。SubC使用一个符号表来存储有关本地和全局变

2021-07-06 00:22:08 872 1

原创 动手实现编译器(十六)——逻辑运算

在上一节中,我们实现了困难的数组定义部分;在这一节中,我们着手实现比较简单的逻辑运算,此外我们也会实现识别负数。SysY语言中包含的逻辑运算符有:一元逻辑运算符 !二元逻辑运算符 &&和||它们语法定义如下单目运算符: UnaryOp → ‘!’ 注:’!'仅出现在条件表达式中逻辑与表达式: LAndExp → EqExp | LAndExp ‘&&’ EqExp逻辑或表达式: LOrExp → LAndExp | LOrExp ‘||’ LAndExp

2021-07-04 21:33:27 538 2

原创 动手实现编译器(十五)——数组(一)

在上一节中,我们实现了注释和变量初始化的功能;在这一节中,我们来实现数组。先来看看,我们要实现的具体功能: int ary[5]; // 定义数组 ary[3]= 63; // 表达式给数组元素赋值 int a; a = ary[4]; // 数组元素赋值变量具体地讲,我们将实现:具有固定大小但没有初始化列表的数组声明数组索引作为赋值中的右值数组索引作为赋值中的左值数组的SysY语法是数组定义 VarDef

2021-07-02 01:12:10 777 1

原创 动手实现编译器(十四)——注释和初始化

在上一节中,我们探讨了左结合和右结合,实现了a=b=3这一类的语句,在这一节中,我们将会实现注释和定义变量时赋值。SysY 语言中注释的规范与 C 语言一致,如下:单行注释:以序列//开始,直到换行符结束,不包括换行符。多行注释:以序列/*开始,直到第一次出现*/时结束,包括结束处*/。修改词法分析这是一个比较简单的问题,我们只需要识别出//、/*和*/然后跳过其中的内容即可。 case '/': c = get_nextchr()

2021-06-29 22:36:14 292

原创 动手实现编译器(十三)——左结合和右结合

上一节中,我们实现了真正的全局变量,在这一节中,我们要重新考虑左值和右值的关系。所以,我们可能需要删除我们已经编写的代码并重新编写它以使其更通用,或者修复缺点。我们现在实现的代码:int x;x = 12;这实现得很好,但我知道我们最终必须支持在赋值语句的左侧使用数组元素,例如a[0] = 13;为此,我们必须重新讨论左值和右值。左值是绑定到特定位置的值,而右值是不绑定的值。 左值是持久的,因为我们可以在未来的指令中检索它们的值。另一方面,右值是暂时的:一旦它们使用完毕,我们就可以丢弃它们

2021-06-29 21:02:21 886 1

原创 动手实现编译器(十二)——全局变量

在上一节中,我们实现了函数的调用和返回,在这一节中,我们来处理全局变量。当我们把变量定义的语句放入Block语句分析函数中,我们只能分析Block中的变量定义,即不能处理全局变量。重构变量和常量的汇编我在上一节说过,随着功能的增加,我们会不断修改代码,使功能更加完善和效率更高。首先是ARM汇编中直接MOV操作的立即数最大为11位,超过十一位的立即数将会先储存在内存中,在载入寄存器。我们对立即数载入函数进行修改:#define MAXINTS 1024 // 大整数储存上限int In

2021-06-28 00:47:36 614 1

原创 动手实现编译器(十一)——函数功能(第二部分)

上一节中,我们实现了函数的定义,在这一节中,我们会实现调用函数并返回一个值。具体来说:定义一个函数调用一个目前无法使用的单一值的函数从函数返回一个值将函数调用用作语句和表达式确保void函数永远不会返回值和非void函数必须返回一个值函数调用的SysY语法定义:语句: Stmt → Ident ‘(’ [FuncRParams] ‘)’ ‘;’ | ‘return’ [Exp] ‘;’该函数有一个名称,后跟一对括号,在括号中必须只有一个参数。它既可以作为表达式又可以作为独立语句。修

2021-06-21 10:12:29 331 1

原创 动手实现编译器(十)——函数功能(第一部分)

在上一节中,我们实现了WHILE循环,因为SysY语言没有FOR语句,所以在这一节中,我们将进一步实现简单函数功能。我们在此过程中必须处理的事有:数据类型:char、int、long 等每个函数的返回类型每个函数的参数数量函数局部变量与全局变量对于目前的我们来说,这太难了。所以我们在这里要做的是达到我们可以声明不同的函数。只有我们生成的可执行文件中的 main() 函数会运行,但我们将有能力为多个功能生成代码。首先,我们来看一下简单的函数SysY语法:函数定义: FuncDef → Fu

2021-06-19 17:24:30 328

原创 动手实现编译器(九)——WHILE语句

在上一节中,我们实现了IF语句,在这一节中,我们将进一步实现WHILE循环。从某种意义上说,WHILE循环非常类似于IF语句没有“else”子句,除了总是跳回顶部的循环。WHILE语句的SysY语法如下Stmt → ‘while’ ‘(’ Cond ‘)’ Stmt处理流程:Lstart: 条件 如果条件为假跳到Lend 执行语句 跳转到LstartLend:这意味着我们可以借用扫描、解析和代码生成我们与 IF 语句一起使用的结构并进行了一些小的更改还要处理 WHIL

2021-06-18 20:02:30 503

原创 动手实现编译器(八)——IF条件语句

在上一节中,我们实现了比较运算符的计算,现在,我们可以容易地实现IF条件语句。首先我们看IF语句的SysY语言的定义:语句: Stmt → LVal ‘=’ Exp ‘;’ | ‘if’ '( Cond ‘)’ Stmt [ ‘else’ Stmt ]修改词法分析首先,我们要增加新的单词类型,表示"{","}","(",")",“if”,"else"六种符号。// 单词类型enum{ T_EOF, T_ADD, T_SUB, T_MUL, T_DIV, T_MOD, T_E

2021-06-18 11:52:08 1440 1

原创 动手实现编译器(七)——比较运算符

上一节中,我们已经实现了全局变量的声明、赋值和计算,本节中我们将会实现计较运算符的计算。==, !=, <, >, <=, >=修改词法分析首先增加新的单词类型// 单词类型enum{ T_EOF, T_ADD, T_SUB, T_MUL, T_DIV, T_MOD, T_EQ, T_NE, T_LT, T_GT, T_LE, T_GE, T_INT, T_SEM, T_PRINT, T_EQU, T_IDENT, T_KEYINT};我们

2021-06-17 00:35:19 386 1

原创 动手实现编译器(六)——实现全局变量

我们在上一节中实现了对语句的编译,在这一节中,我们希望向语句中加入变量。实现以下语句:int a;int b;int c;int d;int e;int f;int g;a = 2;b = 3;c = 4;d = 5;e = 6;f = 7;g = 8;print a + b * c / d % e - f + g;这需要变量有以下功能:声明变量使用变量获取存储值给变量赋值相关语法定义变量声明: VarDecl → ‘int’ Ident ‘;’变量赋值:

2021-06-15 20:43:54 585 1

原创 动手实现编译器(五)——实现语句

在上一节,我们已经实现了一条表达式的计算,在这一节中,我们要真正实现语句。我们来看看SysY语言中对语句的定义:语句: Stmt → LVal ‘=’ Exp ‘;’ | [Exp] ‘;’ | Block| ‘if’ '( Cond ‘)’ Stmt [ ‘else’ Stmt ]| ‘while’ ‘(’ Cond ‘)’ Stmt| ‘break’ ‘;’ | ‘continue’ ‘;’| ‘return’ [Exp] ‘;’为了给明显的输出结果,我们增加一条语法:打印结果:p

2021-06-15 00:33:10 814 1

原创 动手实现编译器(四)——目标代码生成器

在前几节中,我们实现了词法分析器、语法分析器、语义分析器和测试器,可以正确处理一条加减乘除取模运算语句。在这一节中,我们将用目标代码生成器替换测试器,实现真正的编译器。测试器/*测试器代码*/// AST操作符char *ASTop[] = {"+", "-", "*", "/", "%"};// 给定一个AST,返回一个表达式int interpretAST(struct ASTnode *n){ int leftval, rightval; // 获得左、右子树值

2021-06-14 20:47:21 1990

原创 动手实现编译器(三)——语义分析

我们在上一节中看到,语法分析器可以识别SysY语言的部分简单语法,并检查编译器的输入是否符合该语法,但不能处理不同的运算符优先级。因为,该代码将所有运算符都视为具有相同的优先级。为了解决这个问题,我们必须在语法分析器中添加代码来执行操作符优先级。至少有两种方法可以做到这一点:在语言的语法中明确运算符优先级使用运算符优先级表影响现有的语法分析器我们来看SysY语言中对于加减乘除取余的语法定义:加减表达式 :AddExp → MulExp | AddExp (’+’ | ‘−’) MulExp

2021-06-13 00:16:53 2071 1

原创 动手实现编译器(二)——语法分析

在这一节中,将介绍语法分析器。在上一节的词法分析上实现SysY语言语法分析,来解析类似2 - 15 / 7 + 3 * 8 T_EOF(T_EOF表示终结符)由于SysY语言的语法是递归的,因此可以递归解析它。可以编写如下所示的伪代码:递归解析函数() { 扫描并检查第一个令牌是一个数字。如果不是,则返回错误。 获取下一个单词。 如果到达输入的末尾,则返回结果。 否则,调用递归解析函数()。}抽象语法树为了进行语义分析,我们需要代码来解释识别的输入,或将其转换为另一种格式,例如汇编代

2021-06-12 00:03:39 4138 5

原创 动手实现编译器(一)——词法分析

第一部分:词法分析我们从一个简单的词法分析器开始我们的编译器编写。词法分析器的工作是依次扫视字符串形式源程序中的各个字符,逐个识别出其中的单词,并将其转换为内部编码形式的单词符号串作确为输出。从简单的单词开始:五个基本的数学运算符(*,/,+,-,% )和十进制整数(0…9)扫描到的每个单词都将存储在此结构中:// 单词结构体struct token { int token; int intvalue;};其中 token 字段可以为以下值之一:enum{ T_ADD, T_

2021-06-11 00:17:18 1364

原创 win10 MySQL 8.0忘记密码

win10 MySQL 8.0忘记密码1、cmd命令行进入MySQL的bin文件夹下2、在cmd中输入以下语句net stop mysql //关闭MySQL连接mysqld --console --skip-grant-tables --shared-memory //跳过密码登陆MySQL控制台3、此时cmd窗口卡住,继续新建cmd窗口,命令行进入MySQL的bin文件夹下,输入mysql -hlocalhost -uroot -p 或者 直接打开 MySQL 8.0 Command Lin

2021-03-28 00:55:47 232 1

原创 HDU操作系统课程设计实验五

HDU操作系统课程设计实验五一、设计目的二、内容要求三、实验内容四、实验核心代码这是一个比较复杂的实验,前提条件是对文件存储空间的管理、文件物理结构、目录结构和文件操作有一定的了解。因为我不是做的FAT文件系统而是选做仿UNIX System V5的混合索引文件系统,对大部分人没有帮助,因此仅作记录。一、设计目的通过具体的文件存储空间的管理、文件物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。二、内容要求(1)在内存中开辟一个虚拟磁盘空间作为文件存储分区,在

2021-02-15 02:41:54 2315 1

原创 codeforces #700 Div.2

codeforces #700 Div.2 记录[A. Yet Another String Game](http://codeforces.com/contest/1480/problem/A)[B. The Great Hero](http://codeforces.com/contest/1480/problem/B#)[Searching Local Minimum](http://codeforces.com/contest/1480/problem/C)A. Yet Another Strin

2021-02-15 02:24:49 200

原创 HDU操作系统课程设计实验三

HDU操作系统课程设计实验三一、设计目的二、内容要求三、实验内容信号量的使用1.实现一个模拟的shell,基本功能加find、grep命令2.实现一个管道通信程序,基本功能加有名管道通信3.利用Linux的消息队列通信机制实现两个线程间的通信,基本功能加多进程(线程)同步、互斥通信4.利用Linux的共享内存通信机制实现两个进程间的通信,基本功能加双向通信四、实验核心代码这是一个比较简单、容易的实验,前提条件是对Linux的信号量、进程创建与删除、管道通信、消息队列、共享内存等进程通信方式有一定的了解。注

2021-02-03 02:09:42 5025 4

原创 HDU操作系统课程设计实验二

HDU操作系统课程设计实验二一、设计目的二、内容要求三、实验内容实验思路:实验过程:输出按列对齐输出系统中所有内核线程的程序名、PID、进程状态、进程优先级、父进程的PID参数为某个进程的PID号,类似pstree的输出该进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID号及进程状态:四、实验核心代码这是一个比较简单、容易的实验,前提条件是对Linux内核的父子进程链表遍历、查找、访问等有一定的了解。注意:实验时可能因为模块代码有问题导致模块无法正常加载,被阻塞在hello_init()函数中,

2021-01-29 01:43:39 2044

原创 HDU操作系统课程设计实验一

HDU操作系统课程设计实验一实验一:Linux内核编译及添加系统调用一、设计目的二、内容要求三、实验内容修改Linux内核标签添加系统调用编译内核显示当前系统名称和版本的系统调用修改nice和prio值的系统调用改变主机名称为自定义字符串的系统调用四、实验核心代码实验一:Linux内核编译及添加系统调用这是一个很简单、基础的实验,只需要看懂源码,然后在源码中稍作修改就行。注意:编译内核花费时间比较长,长则一天,短则2-3小时,如果用虚拟机记得多开机器核心数目(机器核心数目越多越快,但不要超过物理机的核心

2021-01-29 01:00:57 4908

原创 Python tensorflow报错: CUDA_ERROR_OUT_OF_MEMORY

tensorflow报错: CUDA_ERROR_OUT_OF_MEMORY这几天在做卷积神经网络的一个项目,遇到了一个问题CUDA_ERROR_OUT_OF_MEMORY。运行代码时前三四百次都运行正常,之后就一直报这个错误(而且第二次、第三次重新运行程序时,报错会提前),但是程序不停止。今天空闲下来,就看一看 这个问题。详细信息(因为我的报错解决了,所以从网上找了一个相同的报错信息):2017-03-28 23:38:19.485396: E tensorflow/stream_executor/

2020-11-20 21:36:19 2747

原创 imread,imsave,imresize的替代方法

AttributeError: module ‘xxx’ has no attribute ‘xxx’用python时经常会遇到,什么什么库中不存在什么什么方法。百度原因是因为某些问题,该方法在最新版本的库中被移除了,大部分的解决方法是安装其它的辅助库或者升降当前库的版本。这种方法有两个不好之处:1、调用多个库的时候,往往有几个库对别的库的版本有要求,比如这个tensorflow库对于numpy的版本就有要求。改变后者库版本,可能导致前者的库不能使用。2、有时候,我们利用在线的IDE跑代码,而我们改变

2020-08-29 01:52:47 2463 2

原创 kaggle使用教程

学习机器学习的人都知道,训练的时候GPU比CPU要快很多。大部分人的显卡很一般,就算装tensorflowGPU版本,也不比CPU版本计算的快多少,于是我们可以用在线的免费的GPU计算资源kaggle。下面就来详细介绍下如何使用它进行计算。一、注册kaggle账号进入kaggle官网,点击右上角的Register注册账号,登陆的话选择sign in。注意的是,在注册的时候,验证码部分需要科学上网,不然通过不了。建议直接用谷歌账号登入。二、kaggle主页介绍左侧是导航栏,上方是搜索框,在这里面你可以

2020-08-29 01:24:35 30370 11

原创 深度学习概论

Neural NetworkTerm deep learning: Term deep learning refers to training neural networks.single neuron: Inputs x, computes this function by itself, and then outputs y.For example,Size ->single n...

2020-03-20 13:38:20 185

原创 深度学习

开始学习深度学习,学习课程为吴恩达深度学习工程师微专业系列。用这个博客来记录课程笔记。神经网络和深度学习第一周 深度学习概论:学习驱动神经网络兴起的主要技术趋势,了解现今深度学习在哪里应用、如何应用。1.1 欢迎来到深度学习工程师微专业1.2 什么是神经网络?1.3 用神经网络进行监督学习1.4 为什么深度学习会兴起?1.5 关于这门课1.6 课程资源第二周 神...

2020-03-16 11:47:01 138

原创 vs2019装opencv3.4.2cmake报错

在尝试用cmake编译opencv3.4.2版本的时候,报错如下,CMake Warning at cmake/OpenCVDetectCXXCompiler.cmake:147 (message): OpenCV does not recognize MSVC_VERSION "1923". Cannot set OpenCV_RUNTIME Call Stack (most recent c...

2020-02-21 19:29:04 3874 5

原创 ACM总结3--动态规划(dp)和背包问题

思想如果各个子问题不是独立的,不同的子问题的个数只是多项式量级,如果我们能够保存已经解决的子问题的答案,而在需要的时候再找出已求得的答案,这样就可以避免大量的重复计算。由此而来的基本思路是——用一个表记录所有已解决的子问题的答案,不管该问题以后是否被用到,只要它被计算过,就将其结果填入表中。例题1、数踏问题。有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一直走到底层...

2019-10-23 20:09:00 239

原创 ACM总结2--贪心算法

定义在对问题求解时,总是作出在当前看来是最好的选择。也就是说,不从整体上加以考虑,它所作出的仅仅是在某种意义上的局部最优解解题步骤1、从问题的某个初始解出发。2、采用循环语句,当可以向求解目标前进一步时,就根据局部最优策略,得到一个部分解,缩小问题的范围或规模。3、将所有部分解综合起来,得到问题的最终解。注:若要用贪心算法求解某问题的整体最优解,必须首先证明贪心思想在该问题的应用结果就...

2019-10-23 19:22:09 155

原创 ACM总结1--入门数学题

一、防止隐藏的数据溢出例题:SUM(n) = 1 + 2 + 3 + … + nYou may assume the result will be in the range of 32-bit signed integer.Sample input:10Sample output:55http://acm.hdu.edu.cn/showproblem.php?pid=1001当我们...

2019-10-23 12:07:48 157

原创 日常问题-gettimeofday()函数溢出

为了测试C中代码执行消耗的时间,所以用了gettimeofday()函数来做减法算相差时间,输出__getmstime的时间,发现居然是负数,32位的机器使用long long类型不可能会结果溢出,于是我使用了double类型,依然是负数,觉得很奇怪。但是这种表现一定是溢出啊。原代码如下: gettimeofday(&start,NULL); ......//操作代码 ...

2019-07-02 01:32:59 984

原创 stm32 USART串口通信总结

stm32 USART串口通信总结库函数版USART.h#ifndef __USART_H#define __USART_H#include "stdio.h" #include "sys.h" #define USART_REC_LEN 200 //定义最大接收字节数 200#define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收...

2019-03-30 01:37:39 2651

原创 stm32 delay文件总结

stm32 delay文件总结delay.h#ifndef __DELAY_H#define __DELAY_H #include "sys.h" void delay_init(void);void delay_ms(u16 nms);void delay_us(u32 nus);#endifdelay.h声明了三个延时函数delay.c#inclu...

2019-03-30 01:03:16 7917 2

原创 stm32 sys文件总结

stm32 sys文件总结sys.h#ifndef __SYS_H#define __SYS_H #include "stm32f10x.h"//核内外设访问层Core Peripheral Access Layer(CPAL)的头文件,它定义了许多外设要用到的头文件信息 //位带操作,实现51类似的GPIO控制功能//具体实现思想,参考<<CM3...

2019-03-30 00:52:59 6554

原创 usart和uart的通信原理

usart和uart的通信原理一、通信接口介绍1、处理器与外部设备通信的两种方式:并行通信:数据各个位同时传输。(速度快,占用引脚资源多)串行通信:数据按位顺序传输(一位一位传输)。(占用引脚资源少,速度相对较慢)2、串行通信三种传送方式单工:数据传输只支持数据在一个方向上传输半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工...

2019-03-26 23:37:37 3575 2

原创 stm32f103zet6芯片及其单片机(硬件)的总结

stm32f103zet6芯片及其单片机的总结stm32f103zet6芯片单片机开发板总结stm32f103zet6芯片简介最高72MHz工作频率–内嵌经出厂调教的8MHz的RC振荡器–串行单线调试(SWD)和JTAG接口–多达8个定时器–3个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入–2个看门狗定时器(独立的和窗口型...

2019-03-26 00:26:41 111136 2

原创 定时器延时失效问题

定时器延时失效问题问题情形:调用delay.c(定时器延时函数模板)中延时函数但无法延时注意:以模板中两延时函数中间的参数u32 i不能超过1800,举例,想定时一分钟,可以通过for循环让delay_ms(1000)走60次,而不能使用delay_ms(60000),不然程序就可能会跳过延时而出错了。...

2019-03-17 14:08:56 927

原创 STM32《串口USART收发》第一个字符丢失问题

STM32《串口USART收发》第一个字符丢失问题问题及现象stm32 串口发送数据第一字节丢失使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04…接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。当包含有数据的一帧发送完成后,由硬件将该位置位。如果USART_CR1中的TCIE为1,则产生中断。由...

2019-03-17 02:21:05 1731

数码管计算软件.rar

一款快速计算数码管共阴极、共阳极的电平的软件。

2020-05-10

GifCam.rar

一款功能强大的轻量级gif截图工具

2020-05-10

怎样进入blos.zip

详细讲述了怎样进入和设置blos,适合小白阅读。

2020-05-10

easycopy.rar

一款可以在谷歌游览器上实现自由复制的插件

2020-05-10

HDU公选课抢课插件

一款支持hdu方正教学平台的公选课抢课脚本

2020-05-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除