zoukankan      html  css  js  c++  java
  • 手撸编译器(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
         

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

  • 相关阅读:
    程序员优化程序流程
    iOS开发优化的25个方案
    彻底解决_OBJC_CLASS_$_某文件名", referenced from:问题转
    svn服务器搭建与配置
    mac 显示隐藏文件夹
    HDU 2276 Kiki & Little Kiki 2 矩阵构造
    HDU 3306 Another kind of Fibonacci ---构造矩阵***
    HDU 1575 Tr A----矩阵相乘题。
    矩阵的模板----
    HDU 1757 矩阵求第n的递推式
  • 原文地址:https://www.cnblogs.com/nzhl/p/5538210.html
Copyright © 2011-2022 走看看