读龙书学编译原理 手撸编译器(1)...

从上海回来这两天一口气看完了语义分析, 前段也就差不多了, 本来准备看代码生成的, 人突然就不想看了, 老毛病又犯了 : 很久没不敲代码, 手痒的不行, 所以决定边往前推进边实现前面的部分... 想到终于可以开始实现编译器心里就激动的不行, 那么就这么愉快的开始了...

首先当然是规定语言的词法语法, 由于第一次写编译器, 也不想搞得太过复杂, 我准备写的是一个简化版本的C语言, 大部分词法和语法都将才采用C语言标准...

首先是基本类型 :

int, string,bool (这两个C语言里面没有, 但是我还是加了), 为了简化设计, 暂时还是不加浮点数,同时只支持小写, 大写会被当成标识符...

然后是流程控制语句 :

if-else if-else

while

(暂不支持for, do-while, switch, break, continue)

最后提供对函数的支持,但是函数不支持传参- -! :

(但是不支持return)

具体的词法要求如下(并非严格按照C的标准, 为方便实现, 对其进行了简化) :

id : [a-zA-Z_][0-9a-zA-Z_]*

int : -?[0-9]+

string : "[\"|.]*"

接下来是语法 :

prog -> func funcs
      | 

func -> type id () block

block -> { stmts }

stmts -> stmt stmts
     | 

stmt -> type id;
      | type id = expr;
      | type id = judge;
      | if(judge) block
      | if(judge) block else block
      | while(judge) block

type -> int
      | bool
      | string

expr -> expr + term
      | expr - term
      | term

term -> term * unary
      | term / unary
      | unary

unary -> !unary
       | -unary
       | factor

factor -> num
        | boolean
        | (expr)

judge -> judge || join
       | join

join  -> join && equality
       | equality

equality -> equality == rel
          | equality != rel
          | rel

rel -> expr < expr
     | expr <= expr
     | expr >= expr
     | expr > expr
     | expr
     

暂时就想到这么多, 不够之后再补... 下一节开始撸代码...

时间: 2024-11-13 06:13:50

读龙书学编译原理 手撸编译器(1)...的相关文章

读龙书学编译原理 手撸编译器(3)...

写到12点20勉强算是实现了, 缺陷还很多就不多说了, 具体自己上github去看, 上面我写的很清楚... 发现有任何bug随时联系我... https://github.com/zhang77595103/Simple-C

读龙书学编译原理 手撸编译器(2)...

经过一天的实践, 勉强写完了语法分析部分和词法分析的抽象语法树的生成部分... 但是也发现也昨天规定的词法和文法中出现的一些问题, 同时我根据情况进行了一些改动... prog -> func funcs | func -> type id () block block -> { stmts } stmts -> stmt stmts | stmt -> type id; | type id = judge; | id = judge; | if(judge) block |

读龙书学编译原理 手撸词法生成器(3)...

今天撸了一个晚上终于完成了, 感觉还是要说一下体会吧... 其实之前课程本身已经提供了相关的算法伪代码, 那么在思路上应该没有问题, 那么最后我却用了一个晚上才完成最后的hopcroft 算法呢... 其实难点在于数据结构的运用, 这边图论算法熟悉的话应该会感觉轻松一些...(不幸的是我还没有系统的学过算法...) 就具体代码实现本身来讲, 第一个难点在于如何对已存在的状态进行切分, 比较说起来就是split而已, 但实际操作起来切得却是一串dfa的状态, 我刚开始准备只用一个State(用于第

读龙书学编译原理 手撸词法生成器(2)...

今天AI考的还算顺利, 没有不会做的, 目前也没发现错的, 在这里顺便也谈谈AI吧, 我之所以不选AI, 总感觉理论性太强, 学起来不来劲, 经历了大二这一个学期的理论学习, 这AI简直是神课啊, 真是怕了, 大三到英国肯定不选AI... 其实就算在今天下午在考试我也是一直惦记着我的词法生成器... 6点考完, 休息了一波8点左右就开始继续写我的词法生成器的第二部分(从NFA到DFA)了, 过程的还算是顺利, 2个小时左右也就写完了, 之后刷知乎刷到了现在, 真是浪费时间啊... 明天再写一下最

读龙书学编译原理 语法翻译(3)...

接着上节讲, 我们来看如何在分析中插入合适的代码来生成语法树... 对于抽象语法树的总结 : 下面是作业 : [抽象语法树] 在这个题目中,你将完整的实现抽象语法树(包括数据结构的定义.语法树的生成等).首先,请下载我们提供的代码包: http://staff.ustc.edu.cn/~bjhua/mooc/ast.zip 代码的运行方式是: 首先生成语法分析器: $ bison exp.y 然后生成编译器: $ gcc main.c exp.tab.c ast.c 最后使用编译器编译某个源文件

读龙书学编译原理 代码生成(1)...

这两天把编译器撸到了抽象语法树环节, 准备看完第八单元一口气撸完编译器...至于翻译成什么语言, 先看看再说... 之前讨论完语法检查和符号表, 那么前端就算全部结束了, 那么我们可以把视角转移到中后端... 其结构大概是这样的... 这个阶段就是所谓的代码生成, 那么代码生成具体要完成任务是这样的... 这里提到了2个重要的任务, 那么我们首先来看第一个 : 然后是第二个 : 为了讲解这些任务的解决方案, 这是接下来要讲解的两种ISA...

读龙书学编译原理 语法分析(12)...

那么最后我就来看看这个所谓的lr(0)分析表生成算法 : 这个算法乍一看好像又和前面脱节了, 但是如果仔细看之前的讲解, 比如下图, 仔细比较, 感受一下 ... 你会发现 : 每次产生的D其实就相当于是一个新的状态, 那么再看一下closure 和 goto的具体实现 : 不难发现closure其实就是把所有原推导式左侧点的右侧的非终结符(也就是即将探索的第一个非终结符)的推导式全部加入这个集合, 那么为什么要这样做呢 ? 因为这个算法是并行的, 比如上图, 在执行推导式0的时候, 他需要先完

读龙书学编译原理 语法分析(6)...

这两天都没更, 主要是马上要连着要考三门(16, 18, 20), 都没时间学编译器了, 等过了这段时间应该能有很多时间来搞这个, 之后我准备先把之前写的那个词法分析器生成器改造一下, 弄个最简版的正则引擎出来玩玩, 不过这些都是后话了, 今天似乎也没什么时间, 也就把这单元的作业写了一下... 代码比较简单就不多做解释了... 1 #include <ctype.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 voi

读龙书学编译原理 语义分析(1)...

生成了抽象语法树, 接着就来进行语义分析...语义分析的任务如下图: 一个比较简单的类型检查算法可以是这样的 : 加上id之后可以是这样的: 这里就引出了符号表的概念 : 同时符号表还应该满足程序中作用域的概念, 实现作用域的方法如下: 同时符号表还应该解决名字空间的问题, 可以看到图中多次出现list, 但实际编译器仍然应该能够正常运行 : 实现方案可以如下: