zoukankan      html  css  js  c++  java
  • 手撸编译器(2)...

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

    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 judge;

    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
    | id
    | (judge)

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

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

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

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

    代码暂时不贴...

  • 相关阅读:
    IIS Express中添加MIME
    js立即执行函数IIFE(Immediatelyinvokedfunctionexpression)的几种写法
    笑话一则
    字符串操作类 NET代码积累之一
    UrlRewriter使用详解
    压缩和解压缩的方法 from Byte[]
    C#日期格式化
    JavaScript模拟进度条
    让visual studio 2005 自动为类加版权
    godaddy免费空间完美安装部署dedecms
  • 原文地址:https://www.cnblogs.com/nzhl/p/5540349.html
Copyright © 2011-2022 走看看