编译原理学习笔记-2.词法分析

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往前多看一个节点,如果想撤销,可以再塞回去
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值