20170219C++项目班02_02递归下降算法/解析器/Scanner实现

来源:互联网 发布:阿里云时间服务器地址 编辑:程序博客网 时间:2024/05/17 06:01

递归下降算法:

1:表达式->项->因子:
2:我们认为:
    表达式 = 项 + 表达式
    表达式 = 项 - 表达式
    表达式 = 项

    项 = 因子 * 项
    项 = 因子 / 项
    项 = 因子

    因子 = 数值
    因子 = -因子
    因子 = ( 表达式 )
注意:上面的就可以体现出优先级了,当涉及到很多运算符的时候,就可以有很多层,这就是递归下降法的原理。

举例说明:

1:1+5*(2-1)
    1:整个为一个表达式
    2:项+表达式 1  +  5*(2-1)
    3:解析左边:
        1:1是一个项
        2:1是一个因子
        3:1是一个数值
    4:解析右边:
        1:5*(2-1)表达式是一个项
        2:因子*项        5  *  (2-1)
        3:解析 左边
            1:5是一个数值
        4:解析右边:
            1:(2-1)是一个项
            2:(2-1)是一个因子
            3:2-1是一个表达式
            4:项-表达式        2  -  1
            5:最终2和1都是数值。
得出:1+*、*=5*-、-=2-1。

解析器:

1:扫描类:得到的是一串字符串:
    1:要有保存整个表达式的地方(待解析的)。
    2:当前的状态,枚举,Token
    3:要有当前位置的信息,pos_
    4:number_是多少。

Scanner实现:

1:strtod函数,从字符串里面取出double型的数据。第二个参数代表读到的结束位置。代码:
case '0':case '1':case'2': case'3':case '4':case '5':case '6':case'7': case'8':case '9':case '.':{//下面的char *pTemp = nullptr初始化,在switch里面加了default之后,case里面就无法进行新变量名的绑定,加上一个作用域就可以了。token_ = TOKEN_NUMBER;char *pTemp = nullptr;number_ = strtod(&buf_[curPos_], &pTemp);//返回的double数据最后一位的下一位区间。curPos_ = pTemp - &buf_[0];//刚好curPos_的值就是下次需要读的值。}break;

2:每个分支执行后,curPos_都应该++,放到预读的那一位。



1 0
原创粉丝点击