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

Posted 内脏坏了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读龙书学编译原理 手撸编译器...相关的知识,希望对你有一定的参考价值。

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

 

首先当然是规定语言的词法语法, 由于第一次写编译器, 也不想搞得太过复杂, 我准备写的是一个简化版本的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
     

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

 

以上是关于读龙书学编译原理 手撸编译器...的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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