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

Posted 内脏坏了

tags:

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

经过一天的实践, 勉强写完了语法分析部分和词法分析的抽象语法树的生成部分... 但是也发现也昨天规定的词法和文法中出现的一些问题, 同时我根据情况进行了一些改动...

prog -> func funcs
      | 

func -> type id () block

block -> { stmts }

stmts -> stmt stmts
     | 

stmt -> type id;
      | type id = judge;
      | id = judge;
      | if(judge) block
      | if(judge) block else block
      | while(judge) block
      | print id;
      | print str;
      | print boolean;
      | print num;

type -> int
      | bool
      | string

judge -> judge \| join
       | join

join  -> join & equality
       | equality

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

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

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

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

unary -> !unary
       | -unary
       | factor

factor -> num
        | boolean
        | str
        | (judge)

 

改动1 : 逻辑操作符 ||, && ---> |, & (主要是方便实现)...

改动2 : expr归入了judge类(关于这一点, 之前我是准备赋值表达式的左边可以是布尔或者整形的, 也就是布尔表达式与整形表达式文法平行, 但是发现这样有个问题, 就是如果要同时为两者加入对括号的支持将导致文法超出递归下降的分析范围, 因为括号可以重叠, 所以当遇到括号时可能需要前看多组token才能判断这个赋值表达式的右边是整形还是布尔类型)

改动3 :加入了对打印和赋值给字符串的支持(这个是昨天忘记了) 

同时暂不支持多函数的调用, 也就是目前只能声明不能调用...

代码暂时不贴...

 

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

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

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

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

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

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

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