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 :加入了对打印和赋值给字符串的支持(这个是昨天忘记了) 

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

    代码暂时不贴...

  • 相关阅读:
    Generate Parentheses
    Length of Last Word
    Maximum Subarray
    Count and Say
    二分搜索算法
    Search Insert Position
    Implement strStr()
    Remove Element
    Remove Duplicates from Sorted Array
    Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/nzhl/p/5540349.html
Copyright © 2011-2022 走看看