文章目录
1.词法分析概况
- MySQL的分析器中会先进行词法分析
1.1 符号(词法单元)
2. 词法分析器实现-基本接口
2.1 定义符合类型
public enum TokenType {
KEYWORD,//关键字
VARIABLE,// 变量
OPERATOR,// 操作符
BRACKET,// 括号
INTEGER,// 整型
STRING,// 字符串
FLOAT,// 浮点数
BOOLEAN// 布尔值
}
2.2 定义词法分析单元-关键词字典
public class Token {
TokenType _type;// 类型
String _value;// 值
public Token(TokenType type, String value) {
this._type = type;
this._value = value;
}
public TokenType getType(){
return _type;
}
public String getValue(){
return _value;
}
@Override
public String toString() {
return String.format("type %s, value %s", _type, _value);
}
/**
* 是否是变量
* @return
*/
public boolean isVariable(){
return _type == TokenType.VARIABLE;
}
/**
* 是否是值类型
* @return
*/
public boolean isScalar(){
return _type == TokenType.INTEGER || _type == TokenType.FLOAT ||
_type == TokenType.STRING || _type == TokenType.BOOLEAN;
}
}
2.3 词法分析器的定义
2.3.1 使用JS语法定义
- 定义枚举类
class Enum {
constructor(type, value){
this.type = type
this.value = value
}
toString(){
return this.type;
}
}
module.exports = Enum
- 定义字典符合类型
const Enum = require('../common/Enum')//引用枚举类型
module.exports = {
KEYWORD : new Enum("KEYWORD", 1),
VARIABLE : new Enum("VARIABLE", 2),
OPERATOR : new Enum("OPERATOR", 3),
BRACKET: new Enum("BRACKET", 4),
INTEGER: new Enum("INTEGER", 5),
FLOAT: new Enum("FLOAT", 6),
BOOLEAN : new Enum("BOOLEAN", 7),
STRING : new Enum("STRING", 8)
}
- 定义字典类
class Token {
constructor(type, value) {
this._type = type;
this._value = value;
}
getType() {
return this._type;
}
getValue() {
return this._value;
}
isVariable() {
return this._type == TokenType.VARIABLE;
}
isValue() {
return this.isScalar() || this.isVariable();
}
isType() {
return (
this._value === "bool" ||
this._value === "int" ||
this._value === "float" ||
this._value === "void" ||
this._value === "string"
);
}
isScalar() {
return (
this._type == TokenType.INTEGER ||
this._type == TokenType.FLOAT ||
this._type == TokenType.STRING ||
this._type == TokenType.BOOLEAN
);
}
// 重新toString,用以比较,不会比较字符串,而是比较对象的内存地址是否相同
toString() {
return `type ${this._type.type}, value ${this._value}`;//比较枚举类型
}
}
- 定义主接口类
3. 实现流的peek和putBack操作
3.1 什么是流
3.2 peek和putBack
- peek 查找当前的next处理节点
- putBack往前多看一个节点,如果想撤销,可以再塞回去