您的位置:首页 > 编程语言 > C语言/C++

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

2017-02-19 20:42 246 查看

递归下降算法:

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_都应该++,放到预读的那一位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 递归 编程 对象