fix u8 error
This commit is contained in:
+13
-7
@@ -3,12 +3,9 @@ use crate::token::lookup_ident;
|
|||||||
use super::token::ASSIGN;
|
use super::token::ASSIGN;
|
||||||
use super::token::COMMA;
|
use super::token::COMMA;
|
||||||
use super::token::EOF;
|
use super::token::EOF;
|
||||||
use super::token::FUNCTION;
|
|
||||||
use super::token::IDENT;
|
|
||||||
use super::token::ILLEGAL;
|
use super::token::ILLEGAL;
|
||||||
use super::token::INT;
|
use super::token::INT;
|
||||||
use super::token::LBRACE;
|
use super::token::LBRACE;
|
||||||
use super::token::LET;
|
|
||||||
use super::token::LPAREN;
|
use super::token::LPAREN;
|
||||||
use super::token::PLUS;
|
use super::token::PLUS;
|
||||||
use super::token::RBRACE;
|
use super::token::RBRACE;
|
||||||
@@ -34,8 +31,8 @@ pub trait LexerTraits {
|
|||||||
pub fn new(input_str: String) -> Lexer {
|
pub fn new(input_str: String) -> Lexer {
|
||||||
let mut l: Lexer = Lexer {
|
let mut l: Lexer = Lexer {
|
||||||
input: input_str,
|
input: input_str,
|
||||||
position: Some(0),
|
position: Some(-1),
|
||||||
read_pos: Some(1),
|
read_pos: Some(0),
|
||||||
ch: Some(0),
|
ch: Some(0),
|
||||||
};
|
};
|
||||||
l.read_char();
|
l.read_char();
|
||||||
@@ -68,6 +65,7 @@ impl LexerTraits for Lexer {
|
|||||||
let c = char::from(lit);
|
let c = char::from(lit);
|
||||||
|
|
||||||
match c {
|
match c {
|
||||||
|
'\0' => tok = new_token(EOF, lit),
|
||||||
'=' => tok = new_token(ASSIGN, lit),
|
'=' => tok = new_token(ASSIGN, lit),
|
||||||
';' => tok = new_token(SEMICOLON, lit),
|
';' => tok = new_token(SEMICOLON, lit),
|
||||||
'(' => tok = new_token(LPAREN, lit),
|
'(' => tok = new_token(LPAREN, lit),
|
||||||
@@ -80,10 +78,10 @@ impl LexerTraits for Lexer {
|
|||||||
if c.is_alphabetic() {
|
if c.is_alphabetic() {
|
||||||
let lit = self.read_identifier();
|
let lit = self.read_identifier();
|
||||||
let tok_type = lookup_ident(&lit);
|
let tok_type = lookup_ident(&lit);
|
||||||
return new_token(tok_type, lit.as_bytes()[0]);
|
return new_token_from_str(tok_type, lit);
|
||||||
} else if c.is_ascii_digit() {
|
} else if c.is_ascii_digit() {
|
||||||
let lit = self.read_number();
|
let lit = self.read_number();
|
||||||
return new_token(INT, lit.as_bytes()[0]);
|
return new_token_from_str(INT, lit);
|
||||||
} else {
|
} else {
|
||||||
tok = new_token(ILLEGAL, lit);
|
tok = new_token(ILLEGAL, lit);
|
||||||
}
|
}
|
||||||
@@ -135,3 +133,11 @@ fn new_token(token_type: &str, ch: u8) -> Token {
|
|||||||
literal: lit,
|
literal: lit,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn new_token_from_str(token_type: &str, lit: String) -> Token {
|
||||||
|
let token_type = String::from(token_type);
|
||||||
|
Token {
|
||||||
|
type_: token_type,
|
||||||
|
literal: lit,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@ fn main() {
|
|||||||
|
|
||||||
let mut l = new(input.to_string());
|
let mut l = new(input.to_string());
|
||||||
|
|
||||||
for (i, tok) in (0..36).map(|_| l.next_token()).enumerate() {
|
for (_i, tok) in (0..37).map(|_| l.next_token()).enumerate() {
|
||||||
println!("{}: {:?}", tok.type_, tok.literal);
|
println!("{}: {:?}", tok.type_, tok.literal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -21,10 +21,10 @@ pub const RBRACE: &str = "}";
|
|||||||
pub const FUNCTION: &str = "FUNCTION";
|
pub const FUNCTION: &str = "FUNCTION";
|
||||||
pub const LET: &str = "LET";
|
pub const LET: &str = "LET";
|
||||||
|
|
||||||
pub fn lookup_ident(ident: &str) -> &str {
|
pub fn lookup_ident(ident: &str) -> &'static str {
|
||||||
match ident {
|
match ident {
|
||||||
"fn" => FUNCTION,
|
"fn" => FUNCTION,
|
||||||
"let" => LET,
|
"let" => LET,
|
||||||
_ => ILLEGAL,
|
_ => IDENT,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user