拥有单元格封闭值副本的所有权

时间:2018-08-20 19:06:40

标签: rust

我目前正在创建“在Go中编写解释器”中描述的编程语言,但是我试图用Rust编写代码。

我有以下表示词法分析器的结构:

struct Lexer<'a> {
    input: &'a [u8], // assume the text input is all ascii
    curr_pos: Cell<usize>,
    read_pos: Cell<usize>,
    curr_char: Cell<char>,
}

和以下表示令牌的结构:

struct Token<'a> {
    tokenType: TokenType<'a>,
    literal: &'a str,
}

其中tokenType是代表各种令牌的枚举。这很标准,但是我对literal的所有权感到麻烦。

当我尝试设置时创建令牌:

Token {tokenType: TokenType::ASSIGN, literal: &self.curr_char.get().to_string()}

我发现有关值&self.curr_char.get().to_string()的寿命不足的错误。所有权规则如何在这里发挥作用,以及“赋予”其Token价值的最佳方法是什么?

这是完整的代码:

use std::cell::Cell;
use std::str;
use std::char;

#[derive(Debug, PartialEq)]
enum TokenType<'a> {
    ILLEGAL,
    EOF,
    IDENT(&'a str),
    INT(i64),
    ASSIGN,
    PLUS,
    COMMA,
    SEMICOLON,
    LPAREN,
    RPAREN,
    LBRACE,
    RBRACE,
    FUNCTION,
    LET,
}

struct Token<'a> {
    tokenType: TokenType<'a>,
    literal: &'a str,
}

struct Lexer<'a> {
    input: &'a [u8], // assume the text input is all ascii
    curr_pos: Cell<usize>,
    read_pos: Cell<usize>,
    curr_char: Cell<char>,
}

impl<'a> Lexer<'a> {
    fn next_token(&self) -> Token {
        const NULL_CHAR: char = 0 as char;
        let token = match self.curr_char.get() {
            '='         => Token {tokenType: TokenType::ASSIGN,    literal: &self.curr_char.get().to_string()},
            ';'         => Token {tokenType: TokenType::SEMICOLON, literal: &self.curr_char.get().to_string()},
            '('         => Token {tokenType: TokenType::LPAREN,    literal: &self.curr_char.get().to_string()},
            ')'         => Token {tokenType: TokenType::RPAREN,    literal: &self.curr_char.get().to_string()},
            '{'         => Token {tokenType: TokenType::LBRACE,    literal: &self.curr_char.get().to_string()},
            '}'         => Token {tokenType: TokenType::RBRACE,    literal: &self.curr_char.get().to_string()},
            ','         => Token {tokenType: TokenType::COMMA,     literal: &self.curr_char.get().to_string()},
            '+'         => Token {tokenType: TokenType::PLUS,      literal: &self.curr_char.get().to_string()},
            '\0'        => Token {tokenType: TokenType::EOF,       literal: &self.curr_char.get().to_string()},
        }
    }
}

0 个答案:

没有答案