【编译原理】实验二 词法分析程序

2023-05-16

一、实验标题:词法分析程序

 

二、实验目的:学习和掌握词法分析程序构造的状态图代码化方法。

 

三、实验内容:

(1)阅读已有编译器的经典词法分析源程序。

(2)选择一个编译器,如:TINYPL/0,其它编译器也可(需自备源代码)。阅读词法分析源程序,理解词法分析程序的构造方法——状态图代码化。尤其要求对相关函数与重要变量的作用与功能进行稍微详细的描述。若能加上学习心得则更好。TINY语言请参考《编译原理及实践》第2.5节;PL/0语言请参考相关实现文档。

(3)确定今后其他实验中要设计编译器的语言,如:C-语言,其定义在《编译原理及实践》附录A中。也可选择其它语言,不过要有该语言的详细定义(可仿照C-语言)。一旦选定,不能更改,因为要在以后继续实现编译器的其它部分。鼓励自己定义一门语言。

(4)根据该语言的关键词和识别的词法单元以及注释等,确定关键字表,画出所有词法单元和注释对应的DFA图。

(5)仿照前面学习的词法分析器,编写选定语言的词法分析器。

(6)准备2~3个测试用例,要求包含正例和反例,测试编译结果。

 

四、准备工作:

1、使用C- 语言作为以后编译器设计语言。

2、阅读Tiny词法分析源程序心得

在编写C-语言编译器之前,先学习了Tiny的词法分析器。其词法分析器的构造基本步骤可以总结如下:

A.构造方法:

step1找到记号:完整的词法分析器,应该先分清楚记号:在定义某一种语言的时候,会给出其需要使用的记号。Tiny语言的记号分为三类:8个保留字、10个特殊标号、其他记号:数和标识符。

 

 

Step2DFA状态图构建

根据记号,可以构建DFA图,其注意事项如下:

①可以分别为不同种类的符号各自画出DFA图,最后合成一个DFA图;

②对于不同的DFA可能有多个接受状态,其返回值也不同。将多个状态图合并时,同时将接受状态合并为一个最终的接受状态;每个记号可以根据最后一个输入符号的不同,返回不同的词素,用来在最终状态中区分各种词素。

③需要注意语法惯例:如,{}为注释,之间不能有嵌套;最长子串原则;以及后续接识别记号。

④对空白符的处理:制表符、空格、回车被当做空白符处理。其处理过程在初始状态,如果输入的符号为空白符,那么当前状态仍为初始状态。即不将空白符当做一个词法单元处理。

⑤对保留字的处理:不单独为保留字设置DFA状态图,创建枚举类型来保留关键字;读取由字符构成的ID,该ID识别结束后,在枚举类型中查找是否是保留字,如果是保留字,则做特殊处理。

⑥两种获取下一个字符的方式:第一种是直接消耗掉输入符号,如果在识别一个记号的过程中,读到某一个符号就能确定该记号读取完毕,那么该符号是可以被直接消耗掉的;第二种是不消耗输入符号,如果在识别一个记号的过程中,读到某一个输入符号能确定该记号读取完毕,但是该符号并不属于该记号时,该符号不能被消耗。Tiny在区别这两种方式的方法是在DFA中添加[other]边,如果是通过[other]边到达接受符号,那么表示该[other]符号需要被回吐。

 

Step3使用while+switch双循环将DFA代码化

词法识别主要用到的函数是getToken,每执行一次,返回一个词法单元。

外层while循环为:当前状态不为接受状态时,每次循环获取一个字符;直到到达接受状态,说明一个词法单元识别完毕。将该词法单元存储,并打印出来。

内层switch循环为:判断当前状态,依据当前输入的符号进行状态的切换,同时选择该符号是否被存储该字符是否被回吐以及在接受状态下设定当前词法单元的类型

 

B.文件结构

Ø Global.h中包含了词法分析器中包含的全局变量:

extern FILE* source;

源代码文件

extern FILE* listing;

输出tsxt文件

extern FILE* code;

中间代码文件

extern int lineno;

当前行号

typedef enum {}TokenType;

枚举类型的保留字

Ø 文件main.c作为编译器入口:设置了编译选项,从中读取文件,传递给词法分析器;

Ø 文件scan.hscan.c作为词法分析源程序

数据

typedef enum { } StateType;

枚举类型,保存状态

tokenString[MAXTOKENLEN+1];

保存标识符

static char lineBuf[BUFLEN];

读取一行字符保存

static int linepos = 0;

指示缓存中第几个字符

static int bufsize = 0;

当前缓存中字符串长度

static int EOF_flag = FALSE;

错误标识

reservedWords[MAXRESERVED]

保留字结构,方便查询

函数

static int getNextChar(void)

获取缓存中下一个字符

static void ungetNextChar(void)

读取但不消耗下一个字符

static TokenType reservedLookup (char * s)

查看标识符是否为保留字

TokenType getToken(void)

返回标识符

 

Ø 文件util.hutil.c作为词法单元输出程序

函数:printToken(TokenType token, const char* tokenString)被词法分析程序scan.c调用,用来输出所识别到的词法单元的内容以及词素。

 

五、文件清单:

文件名

用途

tinc2.dev

词法分析项目文件,可以用devc打开

main.c

程序入口文件

GLOBALS.h

main函数的头文件,定义了全局变量

scan.c /scan.h

词法分析源程序

util.c/util.h

词法输出源程序

test1.c-

测试样例一,完整源程序

test2.c-

测试样例二,测试尽可能识别的词法单元

test3.c-

测试样例三,能想到的所有不能接受的词法

 

六、设计过程:

概述:根据在Tiny编译器中学习到的词法分析过程,构造C-编译器的词法分析源程序。

1. 找到C-语言使用到的记号

如下图为:C—语言的详细定义

 

我们可以发现处理记号时,有以下几点需要注意:

Ø 关键字:除了数量减少以及关键词内容有所改变以外,关键字都是由字母小写构成,其中不添加其他符号,所以我们在关键字处理方式可以使用Tiny编译器的处理方式。

Ø 专用符号:在tiny编译器的基础上,增添了有两个符号构成的符号,例如<=>===、!=等,这需要在构建C-词法分析状态转换图时需要注意;除此之外,<=是被当做小于等于而不是小于和等于两个词素的原因是我们默认遵循最长子串原则,其中具体构建方法见下一步。

Ø 其他标记ID/NUMNUM只包括数字、ID只包括大小写字母,且字母区分大小写。

Ø 注释:C-语言的注释前置符号和后置符号都又两个符号构成’/’’*’;处理该符号时需要注意。

 

2. 构造DFA

Ø 专用符号的状态转换图:

 


在第一步中,我们已经发现了专用符号的状态转换图需要注意的地方。

² 我们将由一个符号构成的专用符号:+ - * ; , ( ) [ ] { }合并为一条边,只要在初始状态中当前符号为以上符号,那么直接可以转向接收状态。

² 由两个符号构成的专用符号:”<=” “ >=” “ ==” “ !=”需要特殊处理。在输入前一个符号后进入一个中转状态(表示已接收到前一个符号),再检测接下来的输入符号。如果输入符号是特殊符号中的第二个符号,表示接受到了由两个符号组成的特殊符号,存储这个特殊符号,跳转到接受状态;如果输入符号为其他符号,那么说明我们接受到了由一个符号构成的特殊符号,需要将当前符号回吐,再跳转到接收状态。

² 特殊的符号’/’,该符号同时作为除的表示以及注释的开端,上面的转换图中不予以表示。

² 根据进入接受状态的符号的不同,需要在接受状态设置词法类型,特殊符号返回词法类型如下表格:

符号

类型

符号

类型

符号

类型

符号

类型

+

PLUS

>

GT

)

RPAREN

<=

LTE

-

MINUS

=

EQ

[

LBRK

>=

GTE

*

TIMES

;

SEMI

]

RBRK

==

EEQ

/

OVER

,

COMMA

{

LBRACE

!=

NEQ

<

LT

(

LPAREN

}

RBRACE

 

 

 

Ø IDNUM状态转换图

 

该状态转换图较为简单,INNUMINID状态分别表示以及接受了一个以上的数字或者字母。如果接收到非数字或非字母的数字即跳转到接受状态,并且将最后一个输入的字符回吐。

符号

词法类型

标识符

ID

数字

NUM

 

Ø 注释状态转换图

 


上图为注释的状态转换图,需要注意的是以下三点:

² 注释是不会到达接受状态,因为注释不需要做词法分析,读到完整的注释之后返回初始状态即可;

² 注释与除号第一个符号相同,在输入符号为/的情况下,下一个输入符号为*时才表示注释开始。如果为其他符号,则表示/为除号。注释结束时,输入符号为*,下一个输入符号为/时表示注释结束,下一个输入符号为其他符号时,则表示还在注释中。

² 在注释中,如果接受到*后进入RCOM状态,此时接受到/才表示注释结束,如果是其他符号,则需要返回INCOMMENT状态,表示*是注释中的一部分,而不是注释的结束符号。

 

Ø 总状态转换图

下图状态转换图,橘色线条表示的是特殊符号的状态转换图、蓝色部分是注释以及除号的状态转换图、黑色部分是IDNUM状态转换图,其次添加了开始状态输入符号为空白符号时的自旋边。

构造状态转换图结束后查错:该状态转换图是DFA,即每个状态对应的任何一个输入符号只有一条转换到其他状态的边。

 

 

 

3. 使用while+switch循环使DFA图代码化

Ø 概述:首先构造数据类型和函数用来存储相应数据以及功能的实现,其次简要介绍关键函数的实现及伪代码。

Ø 数据函数定义

数据

typedef enum { } TokenType

枚举类型,保存词素类型

typedef enum { } StateType;

枚举类型,保存状态

tokenString[MAXTOKENLEN+1];

保存标识符

static char lineBuf[BUFLEN];

读取一行字符保存

static int linepos = 0;

指示缓存中第几个字符

static int bufsize = 0;

当前缓存中字符串长度

static int EOF_flag = FALSE;

错误标识

reservedWords[MAXRESERVED]

保留字结构,方便查询

函数

static int getNextChar(void)

获取缓存中下一个字符

static void ungetNextChar(void)

读取但不消耗下一个字符

static TokenType reservedLookup (char * s)

查看标识符是否为保留字

TokenType getToken(void)

返回标识符

 

Ø getNextChar方法:

² 每次从文件中读入字符(长度为bufsize)存入缓冲区,每次返回缓冲区中的一个符号;

² 读取符号位置使用linepos标记,当linepos不小于bufsize的时候即缓冲区中符号读取完毕时,从文件中读取一行字符存入缓冲区,将linepos置为0。如果没有读取成功说明到达文件结尾EOF设置为true

 

int getNextChar(void){

  if(!(linepos < bufsize)){/*行缓冲区用完了*/

  行标增加

  从source文件中读取长度为BUFLINE-1的字符串存到行缓冲区符串*/

         If(读取成功)

      将bufsize设置为缓冲区字符长度

  从buf最开始读取

  返回当前字符,并且列号+1

  }

  else{

  没有读取成功,说明文件结束

  }

  }

  else{

  返回当前字符

  }

}

 

Ø unGetnextChar方法:

如果文件没有结束,那么直接将linepos减去1就可以重新读取该字符以实现回吐的目的。

 

Ø ReserveLookup方法

根据getToken返回的字符,在保留字数组中进行查找。如果找到,说明该词素为保留字,返回保留字的类型。否则返回ID表示该词素的类型为ID

 

Ø getToken方法:

使用while+switch方法,每调用一次getToken返回一个词素;每执行一趟while表示一次状态的跳转,其中还包括了对词素的存取等等。

getToken(){
设置开始状态state = START
设置是否存储标记save
While(当前状态不是接受状态)
C = 下一个字符;
save设置为保存
Switch(state){
      Case START:
          根据输入符号,判断跳转状态,C是否被储存、是否回吐
          break;
      Case INLCOM:
          根据输入符号,判断状态跳转,C是否被储存、是否回吐
          break;
       .................
       Case DONE:
       Default:
}
将C加入到词法单元字符串中
if(state == Done){
      获取到了一个词法
      If(currentToken==ID)
          检查词法类型是否为保留字
}
}

 

4. 输出词法单元

为了方便查看测试样例,打印输出每一次识别的词素,根据getToken中返回的词法单元,对每个词法单元进行打印。

 

七、实验测试:

Ø 测试样例一(test1.c-):完整的C-语言源程序

 

 

 

结果:

1~3行为注释,词法分析器将其跳过

4行分别识别了词法单元中①保留字:INT;②特殊符号( ,) { ;③标识符ID,其中对应name分别为x,y

                                                       

 

5行识别了词法单元中①保留字:WHILE;②特殊符号:(  /  !=  )  { ;③IDxy  NUM1

 

 

6~17行不再赘述

18行文件结束

 

 

Ø 测试样例二(test2.c-)测试尽可能识别的词法单元

 

 

结果:

1~3行为注释,没有被词法分析器分析

 

 

6~7行为C-语言的保留字,都被识别

 

 

10~12行为C-语言的特殊符号,都被识别

  

 

15行为被空格分割的标识符和数字,16行为被空格分割的标识符和标识符,分别被识别。

 

 

Ø 测试样例三(test3.c-):测试能想到的所有不能接受的词法单元

 

结果:

2行为不会被识别的特殊符号,其中+=C-语言中未被定义,被当做+=识别

 

 

3行,原意为标识符中包含数字,但不是C-语言的词法,被当做标识符start、数字555和标识符end

 

 

4行为标识符中包含保留字,以最长子串为标准,输出了标识符ifn而不是保留字if

 

5行为没有结束符号的注释,其注释开始符号向后的所有字符都将被当做注释,被词法分析器忽略掉;

 

八、实验心得:

此次实验增强了我对词法分析器过程的了解同时也引发了我对词法分析器以及语言定义的一些思考。

本次实验分为两个部分,第一部分是对Tiny的词法分析器中源代码进行学习;第二部分是自己构建C-语言的词法分析。如果没有第一部分中对Tiny语法分析器的学习,在第二部分是很难自己构建出C-语言的词法分析器的。原本是想自己来尝试以自己的思路去编写,但是读了Tiny的源代码之后发现其使用的方法肯定会比我自己编写更高效。

Tiny已经是一个完整的编译器了,其中构架是比较完善的,担心自己写了词法分析器后,与后面的实验可能会承接不上,所以选择以Tiny的架构来编写自己的词法分析器。除了学习其中编译器的架构之外,还学会了通过状态图去构建词法分析器。相比想象中读取一个字符然后判断这个字符和前面的其他字符可能构建出来哪些词法单元这种方法来说,用DFA构建词法分析器无疑是一个更好的方法。DFA向我们更清晰地展示了词法单元的读取过程,在查找词法分析器中的错误也可以更加清晰明了。

词法分析器的精华部分在于状态转换图,如果能够清晰的画出状态转换图,词法分析器的构造就完成了一大半。但是状态转换图的构造并不是十分容易,在此次状态转换图构造过程较为简单,这是因为此次使用的C-语言,其已经将C语言简化了很多。如果构建更加复杂的语言的状态转换图,难度还是较大的。与此同时此次的C-语言的状态转换图也足以以小见大。例如在>=的分析过程中,如果没有前人已经规定好的最长子序列优先原则,那么我可能就会去纠结应该将其分析为大于等于还是大于号和等于号这个问题了。换句话来说,定义一个语言要考虑的问题也很多,其是否会有歧义?是否不能构造出一个正确的DFA?等等。

在代码实现DFA的过程中,同样遇到了一些问题,例如,/ /*的分析,前者是除号会被保存在词法单元,后者是注释的开始符号将被词法分析器忽视。按照最长子序列优先原则,可以解决分析为哪个符号。但是问题出现在输入符号的保存过程中。因为读取到/后面的一个符号才能够直到当前符号串为/还是/*,在读入/符号时就不能确定/符号是否应该保存。最终想到的办法是在第二个符号确定后,如果不是*那么就将/另外加入词法单元。这样虽然解决了问题,却破坏了原来程序的简洁明了的结构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【编译原理】实验二 词法分析程序 的相关文章

  • 论文阅读笔记《Joint Graph Learning and Matching for Semantic Feature Correspondence》

    核心思想 本文提出一种联合图学习和图匹配的算法 xff08 GLAM xff09 xff0c 将图的构建和匹配过程整合到一个端到端的注意力网络中 相比于其他启发式的建图方法 xff0c 如Delaunay三角法 KNN方法或完全图 xff0
  • 为了安装caffe 安装opencv

    cmake D CMAKE BUILD TYPE 61 RELEASE D CMAKE INSTALL PREFIX 61 home lab248 anaconda2 D INSTALL PYTHON EXAMPLES 61 ON D IN
  • 腾讯轻量云服务器控制台详细介绍及建站操作图文教程

    腾讯轻量应用服务器控制台与腾讯云服务器不同 xff0c 轻量应用服务器主要是在控制台上集成了大部分建站功能 xff0c 通过简单点击几次鼠标就可以轻松建站 xff0c 易学易用 不过对于没接触过的新手来说 xff0c 还是有点陌生的 xff
  • 腾讯云轻量应用服务器快速搭建一个专属网盘

    一 前言 xff1a 云盘我想大家接触的一定不会少 云盘很好地解决了文件存储和共享的问题 xff0c 但随着大量云盘厂商的退出 xff0c 剩余的云盘服务也越来越少 有些云盘虽然上传速度快 xff0c 但是下载速度较慢 xff0c 不开通会
  • 使用腾讯云轻量应用服务器搭建一个简洁漂亮的目录

    前言 作为一个摄影爱好者 xff0c 会经常做一些图片的分享 xff0c 前端时间在网上看到了一个非常好看的目录 xff0c 这里给大家分享一下怎么样通过腾讯轻量应用服务器来搭建 官方介绍 files photo gallery是一款简洁漂
  • 玩转服务器-博客两件套之绝佳的Markdown写作平台CodiMD

    前言 大家都很羡慕博主的高产 xff0c 纷纷问我有什么技巧 我的回复是手熟 xff0c 多写 xff0c 那么多写就需要一个比较好的工具 xff0c 所以我这里给大家介绍一个在线markdown文档平台 xff0c 让大家可以随时书写文档
  • 玩转服务器-博客两件套之开源的一文多发平台ArtiPub

    玩转服务器 博客两件套之开源的一文多发平台ArtiPub 前言 上次给大家介绍了 xff0c 博主在线的markdown文档平台 xff0c 让大家可以随时书写文档和博客 xff0c 那么很多朋友在很多平台都看到了我的文章 xff0c 我是
  • 使用acme.sh申请Let‘s Encrypt免费的SSL证书

    使用acme sh申请Let s Encrypt免费的SSL证书 说明 xff1a Let s Encrypt 是一个由非营利性组织 互联网安全研究小组 xff08 ISRG xff09 提供的免费 自动化和开放的证书颁发机构 xff08
  • win7操作系统下laravel/homestead在SSH auth method: private key卡住提示Warning: Connection reset. Retrying的解决方案

    将VirtualBox兼容模式改为win7 勾选以管理员身份运行 安全里面各组个用户全部编辑好权限并勾选 电脑开机后优先双击VirtualBox启动后在执行git命令行进行启动
  • 为什么用了索引,SQL查询还是慢?

    原文链接cnblogs com jackyfei p 12122767 html 经常有同学疑问 xff0c 为什么有时候一个SQL语句使用了索引 xff0c 为什么还是会进入到慢查询之中呢 xff1f 今天我们就从这个问题开始来聊一聊索引
  • 腾讯云轻量应用服务器器使用技巧-腾讯云OrcaTerm的上传下载

    前言 xff1a 上传下载是WebShell中不可或缺的功能之一 xff0c 也是我在日常管理过程中经常使用操作 这里就跟着博主的视角来揭秘 xff0c 腾讯云OrcaTerm的上传与下载 对比 博主对比了一些shell的应用 xff0c
  • C语言strtok函数

    strtok是C语言用于分割字符串的函数 xff0c 需要include lt string h gt 第一次使用时第一个参数传入待分割的字符串 xff0c 第二个参数传入分割符号 第二次使用时第一个函数传入NULL 第二个参数传入分割符号
  • CSS | 置换元素(可替换元素)

    文章目录 置换元素 定义 常见置换元素 固有尺寸 非置换元素 注意 若文章有任何纰漏或未涉及你想了解的内容 欢迎在评论提出 我会尽最快速度回复 置换元素 定义 置换元素是具有固有尺寸 intrinsic dimensions 浏览器根据其标
  • 人体姿态估计综述(Human Pose Estimation Overview)

    主流数据集整理 xff1a http blog csdn net qq 36165459 article details 78332172 Part1 xff1a Single Person Pose Estimation 2015 年之前
  • 1到100的二进制表示

    1 61 1 2 61 10 3 61 11 4 61 100 5 61 101 6 61 110 7 61 111 8 61 1000 9 61 1001 10 61 1010 11 61 1011 12 61 1100 13 61 11
  • 画格子

    题目描述 画一些小格子 xff0c 如下所示 xff1a MAKEAMERICA AKEAMERICAG KEAMERICAGR EAMERICAGRE AMERICAGREA MERICAGREAT ERICAGREATA RICAGRE
  • golang -----------字符串(rune,string,type)

    一 内存布局 字符串在Go语言内存模型中用一个2字长的数据结构表示 它包含一个指向字符串存储数据的指针和一个长度数据 因为string类型是不可变的 xff0c 对于多字符串共享同一个存储数据是安全的 切分操作str i j 会得到一个新的
  • HTTP中GET,POST和PUT的区别

    一 HTTP中定义了以下几种请求方法 1 GET xff1b 2 POST xff1b 3 PUT xff1b 4 DELETE 5 HEAD xff1b 6 TRACE xff1b 7 OPTIONS xff1b 二 各个方法介绍 xff
  • B树,B+树,红黑树应用场景笔记

    一 B树的应用 1 B树大量应用在数据库和文件系统当中 它的设计思想是 xff0c 将相关数据尽量集中在一起 xff0c 以便一次读取多个数据 xff0c 减少硬盘操作次数 B树算法减少定位记录时所经历的中间过程 xff0c 从而加快存取速
  • 使用 Gitee 进行代码管理

    为什么使用 Gitee 这里推荐使用 Gitee 进行代码管理 Gitee 和 Github 最大的区别在我看来就是私有库的免费 xff0c 在 Github 上建立私有库是需要收费的 xff0c 而在 Gitee 上建立私有库是不需要收费

随机推荐

  • kubernetes的Kube-proxy的iptables转发规则

    概念 kube proxy 实际上并不起一个 proxy 的作用 xff0c 而是 watch 变更并更新 iptables xff0c 也就是说 xff0c client 的请求直接通过 iptables 路由 如果kube proxy通
  • kube-proxy ipvs模式详解

    一 kube proxy 开启 ipvs 1 环境准备 xff1a 测试环境为kubernetes集群 xff0c 一台master节点 xff0c 一台node节点 集群网络使用flanneld搭建 注意 xff1a master节点上也
  • k8s部署Traefik

    Ingress ingress是从kubernetes集群外访问集群的入口 xff0c 将用户的URL请求转发到不同的service上 Ingress相当于nginx apache等负载均衡方向代理服务器 xff0c 其中还包括规则定义 x
  • (1)webpack介绍

    一 webpack简介 webpack 61 Web Package xff0c webpack是一个现代JS应用程序的静态模块打包器 xff08 module bundler xff09 模块 xff08 模块化开发 xff0c 可以提高
  • MAML: meta learning 论文分析

    https zhuanlan zhihu com p 57864886 一 Meta Learning 简述 Meta Learning xff08 即元学习 xff09 是最近比较火的研究方向 xff0c 其思想是learning to
  • Oracle数据库权限

    Oracle数据库权限基本认识 一 oracle权限 ORACLE系统提供三种权限 xff1a Object 对象级 System 系统级 Role 角色级 权限分类 1 系统权限 xff1a 系统规定用户使用数据库的权限 xff08 系统
  • 解决:rospack depends 报错: could not find python module 'rosdep2.rospack'. is rosdep up-to-date

    这个问题全部如下 xff1a Traceback most recent call last File 34 home suli local lib python2 7 site packages rosdep2 init py 34 li
  • Ubuntu系统日常崩溃之-terminal打不开

    我也不记得干了什么 xff0c 莫名其妙的terminal就打不开了 xff0c 不只是通过快捷键打不开 xff0c 反正各种都打不开 xff0c 每次点击terminal xff0c 它会出现在任务栏上面 xff0c 之后鼠标就变成圆圈转
  • ARM交叉编译工具链

    为什么要用交叉编译器 xff1f 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序 xff0c 比如在PC平台 xff08 X86 CPU xff09 上编译出能运行在以ARM为内核的CPU平台上的程序 xff
  • 最近发现有很多人一直在问苹果ID双重认证怎么关闭。

    最近发现有很多人一直在问苹果ID双重认证怎么关闭 xff1f 其实我想说大家都粗心了 xff0c 双重认证是和ios版本没有关系的 xff0c 无论什么IOS版本开通的双重认证都是可以关闭的 https support apple com
  • QT - QT中配置MSVC编译环境 以及 VS中配置QT开发环境

    本文主要记录一下如何在 QT5 14 2 中配置 MSVC2017 构建套件 xff0c 以及在VS2017中配置QT的开发环境 开发环境为 Win10 43 QT5 14 2 43 Visual Studio 2017 1 VS2017安
  • Mysql启用only_full_group_by模式

    Expression 3 of SELECT list is not in GROUP BY clause and contains nonaggregated column userinfo t long user name which
  • 配置opencv3.1+caffe

    为了配置caffe做reid这是官方的入口 caffe reid https github com zlmzju caffe tree reid caffe install http caffe berkeleyvision org ins
  • reEFInd(refind)引导Windows+deepin双系统

    本文已迁移至 xff1a https www aflyingfish top articles 7fdc1ca8cf58
  • Kubernetes(K8S)一

    K8S 之前写了docker发现 docker只能在单机部署 docker部署分布式系统还是很麻烦 所以就有了K8S K8S全称Kubernetes xff08 读音 库波奈第丝 xff09 可以把K8S理解为一个在docker基础上进一步
  • 安装Docker Desktop报错WSL 2 installation is incomplete的问题(解决报错)

    WSL 2 installation is incomplete报错如下图所示 xff1a 处理方法 xff1a 1 安装Hyper V虚拟服务 2 安装 适用于 Linux 的 Windows 子系统 xff08 wsl2 xff09 3
  • 如何区分主键和外键以及主表和从表

    转自 xff1a https www cnblogs com miniSimple p 12275861 html 文章导读 xff1a 在后面跟其他数据库做对比的时候 xff0c 这个是其中一个点 xff08 关系型数据库 xff09 把
  • 使用客户端连接 Mysql 出现Error no. 1251错误

    错误详情信息 ERROR 1251 client does not support authentication protocol requested by server consider upgrading Mysql client 问题
  • linux下启动mariadb数据库

    在linux下启动数据库时 xff0c 出现如下错误 span style color rgb 79 79 79 text align justify ERROR 2002 HY000 Can 39 t connect to local M
  • 【编译原理】实验二 词法分析程序

    一 实验标题 xff1a 词法分析程序 二 实验目的 xff1a 学习和掌握词法分析程序构造的状态图代码化方法 三 实验内容 xff1a xff08 1 xff09 阅读已有编译器的经典词法分析源程序 xff08 2 xff09 选择一个编