c++ 42面向对象表达式Scanner 实现
来源:互联网 发布:ubuntu16 安装软件 编辑:程序博客网 时间:2024/06/04 21:16
Scanner 类图。
Scanner 作用是,一个字符一个字符的扫描表达式。登记表达式当前的状态。
完毕,错误,数字,加法,减法,惩罚,除法,左括号,右括号,变量。
Scanner :字符串,数字,当前位置,状态。
字符串转成double 的实现
为什么是指针的指针?
指针传递本质上也是值传递。希望改变指针本身的地址,而不是指针指向的内容。就需要用到指针的指针。看成值传递。
strtod 测试
#include <iostream>#include <string>#include "Scanner.h"#include "Parser.h"using namespace std;int main(void){char *string, *stopstring; double x; string = "3.1415926This stopped it"; x = strtod( string, &stopstring ); cout<<x<<endl; cout<<string<<endl; cout<<stopstring<<endl;return 0;}
Scanner.h
#ifndef _SCANNER_H_#define _SCANNER_H_#include <string>using namespace std;enum EToken{ TOKEN_END, TOKEN_ERROR, TOKEN_NUMBER, TOKEN_PLUS, TOKEN_MINUS, TOKEN_MULTIPLY, TOKEN_DIVIDE, TOKEN_LPARENTHESIS, TOKEN_RPARENTHESIS, TOKEN_IDENTIIER, TOKEN_ASSIGN};class Scanner{public:Scanner(const string& buf);void Accept();//扫描方法double Number() const;//不会修改EToken Token() const;private:void SkipWhite();const string buf_;EToken token_;double number_;//把数字返回,以便parser 类能够解析 parser 创建树节点unsigned int curPos_;//当前扫描的位置。};#endif
Scanner.cpp
#include "Scanner.h"#include <cctype>Scanner::Scanner(const string& buf):buf_(buf),curPos_(0){Accept();//调用构造方法就开始扫描了。}double Scanner::Number() const{return number_;}EToken Scanner::Token() const{return token_;}//忽略空白字符void Scanner ::SkipWhite(){while(isspace(buf_[curPos_])){++curPos_;}}void Scanner::Accept(){SkipWhite();//首先忽略空白字符switch (buf_[curPos_]){case '+':token_=TOKEN_PLUS;++curPos_;break;case '-':token_=TOKEN_MINUS;++curPos_;break;case '*':token_=TOKEN_MULTIPLY;++curPos_;break;case '/':token_=TOKEN_DIVIDE;++curPos_;break;case '(':token_=TOKEN_LPARENTHESIS;++curPos_;break;case ')':token_=TOKEN_RPARENTHESIS;++curPos_;break;case '0':case '1':case '2': case '3': case '4': case '5':case '6': case '7': case '8': case '9':case '.':token_=TOKEN_NUMBER;char* p;number_=strtod(&buf_[curPos_],&p);//&p 是指针的指针 指针指向了第一个不是数字的位置//然后根据&p 得到cur_pos 的位置 指针的位置减去首地址//curPos_ 是一个整数 要将地址转换成数字curPos_=p-&buf_[0];break;case '\\0':case '\n':case '\r':case EOF:token_=TOKEN_END;//表达式结束break;default:token_=TOKEN_ERROR;break;}}
0 0
- c++ 42面向对象表达式Scanner 实现
- c实现面向对象
- c实现面向对象
- c实现面向对象
- c实现面向对象
- C实现面向对象
- C实现面向对象
- C实现面向对象
- 汇编+c 实现面向对象
- c 指针实现面向对象
- c语言实现面向对象
- C语言实现面向对象
- 用c实现面向对象
- C语言实现面向对象
- C语言实现面向对象
- C语言实现面向对象
- 用C实现面向对象
- C语言实现面向对象
- Verdi/Ncverilog/VCS安装过程
- jspSmartUpload实现图片的批量上传
- 画板例子实现
- CSU 1503 点到圆弧的距离 (拉格朗日乘数法)
- 从NSM到Parquet:存储结构的衍化
- c++ 42面向对象表达式Scanner 实现
- Linux之Makefile(strip)
- Hardware Constraints
- Java多线程环境下单例模式实现
- 数据结构之深度优先搜索
- 寻找最大数(三)
- 合唱队
- MFC窗口风格?WS?Window?Styles
- android播放器:mediaplayer之遇到的问题篇