用rust写一个玩具解释器4(完整的lexer)

本文详细介绍了如何使用Rust编写一个完整的词法分析器(lexer)。词法分析器通过position和read_position管理字符读取,并在read_char()函数中实现。在读取到字符后,lexer生成相应的token。read_identifier()函数配合is_var_name()确保识别的标识符以字母开头,已在next_token()中进行了预检查。
摘要由CSDN通过智能技术生成

完整lexer介绍

use crate::token::token; //导入token

const CHAR0: char = 0 as char;

#[derive(Debug,Clone)]
pub struct Lexer {
   
    input: String,
    position: usize,//当前读取的字符
    read_position: usize,//下一个字符
    ch: char,
}

impl Lexer {
   

    //用Into就可以接收&str和String
    pub fn new<S: Into<String>>(input: S) -> Lexer {
   
        let mut l = Lexer {
   
            input: input.into(),
            position: 0, 
            read_position: 0, 
            ch: CHAR0,
        };
        l.read_char();
        l
    }
    fn read_char(&mut self) {
   

        //self.input应该直接弄成迭代器,不想改了
        //而且没有考虑支持中文
        //有点小小的困难,先不支持
        self.ch = self.input.chars().nth(self.read_position).unwrap_or(CHAR0);
        self.position = self.read_position;
        self.read_position += 1;
    }

    pub fn next_token(&mut self) -> token::Token {
   
        let mut tok: token::Token;

        self.skip_whitespace();

        match self.ch {
   
            '=' => {
   
                if self.peek_char() == '=' {
    //==
                    let ch = self.ch;
                    self.read_char();
                    tok = token::Token::new_with_string(token::EQ, {
   
                        let mut x = ch.to_string()
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值