20170219C++项目班02_02递归下降算法/解析器/Scanner实现
2017-02-19 20:42
183 查看
递归下降算法:
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_都应该++,放到预读的那一位。
相关文章推荐
- 20170219C++项目班02_02递归下降算法/解析器/Scanner实现
- 20170219C++项目班02_02递归下降算法/解析器/Scanner实现
- 20170219C++项目班02_02递归下降算法/解析器/Scanner实现
- 20170219C++项目班02_02递归下降算法/解析器/Scanner实现
- 20170219C++项目班02_02递归下降算法/解析器/Scanner实现
- 20170219C++项目班02_02递归下降算法/解析器/Scanner实现
- 20170219C++项目班02_02递归下降算法/解析器/Scanner实现
- 20170219C++项目班02_02递归下降算法/解析器/Scanner实现
- 20170218C++项目班02_01Node实现
- 20170218C++项目班02_01Node实现
- 递归下降方法和LL(1)实现计算器C++
- 每日一个算法------二叉树实现、递归和非递归算法(c++版)
- 20170218C++项目班02_01Node实现
- 20170218C++项目班02_01Node实现
- 最速下降优化算法的C++实现
- 20170218C++项目班02_01Node实现
- C++之实现两个链表合并(迭代和递归版本)(19)---《那些奇怪的算法》
- 20170218C++项目班02_01Node实现
- 20170218C++项目班02_01Node实现
- 算法:C++实现二叉树遍历(递归、非递归)