我目前正在创建“在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()},
}
}
}