Enumération des types de token
Infos de base d'un token
This commit is contained in:
11
src/main.rs
11
src/main.rs
@@ -2,10 +2,10 @@ use std::env;
|
|||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use crate::rlox::RLox;
|
|
||||||
use std::process;
|
use std::process;
|
||||||
|
|
||||||
pub mod rlox;
|
mod rlox;
|
||||||
|
use crate::rlox::RLox;
|
||||||
|
|
||||||
// Exit codes from #include <sysexits.h>
|
// Exit codes from #include <sysexits.h>
|
||||||
const EX_OK: i32 = 0;
|
const EX_OK: i32 = 0;
|
||||||
@@ -54,10 +54,15 @@ fn run_prompt() -> i32 {
|
|||||||
exit_code
|
exit_code
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run( script: String ) -> i32 {
|
fn run( _script: String ) -> i32 {
|
||||||
let rlox_interpreter = RLox { had_error: false };
|
let rlox_interpreter = RLox { had_error: false };
|
||||||
|
|
||||||
|
|
||||||
if rlox_interpreter.had_error { EX_DATAERR } else { EX_OK }
|
if rlox_interpreter.had_error { EX_DATAERR } else { EX_OK }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Implémentations de référence :
|
||||||
|
// https://github.com/munificent/craftinginterpreters/wiki/Lox-implementations#rust
|
||||||
|
|
||||||
|
// Pause :
|
||||||
|
// http://www.craftinginterpreters.com/scanning.html#regular-languages-and-expressions
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
|
mod token_type;
|
||||||
|
mod token;
|
||||||
|
|
||||||
pub struct RLox {
|
pub struct RLox {
|
||||||
pub had_error: bool,
|
pub had_error: bool,
|
||||||
@@ -6,11 +7,11 @@ pub struct RLox {
|
|||||||
|
|
||||||
|
|
||||||
impl RLox {
|
impl RLox {
|
||||||
fn error( &self, line: u32, message: String ) {
|
fn error(&self, line: u32, message: String) {
|
||||||
self.report(line, String::from(""), message);
|
self.report(line, String::from(""), message);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn report( &self, line: u32, place: String, message: String ) {
|
fn report(&self, line: u32, place: String, message: String) {
|
||||||
println!("[line {line}] Error {place}: {message}");
|
println!("[line {line}] Error {place}: {message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
15
src/rlox/token.rs
Normal file
15
src/rlox/token.rs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
use super::token_type::TokenType;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Token {
|
||||||
|
token_type: TokenType,
|
||||||
|
lexeme: String,
|
||||||
|
literal: String,
|
||||||
|
line: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Display for Token {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "{0} {1} {2}",self.token_type, self.lexeme, self.literal)
|
||||||
|
}
|
||||||
|
}
|
||||||
105
src/rlox/token_type.rs
Normal file
105
src/rlox/token_type.rs
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum TokenType {
|
||||||
|
// Single-character tokens.
|
||||||
|
LeftParen,
|
||||||
|
RightParen,
|
||||||
|
LeftBrace,
|
||||||
|
RightBrace,
|
||||||
|
Comma,
|
||||||
|
Dot,
|
||||||
|
Minus,
|
||||||
|
Plus,
|
||||||
|
Semicolon,
|
||||||
|
Slash,
|
||||||
|
Star,
|
||||||
|
|
||||||
|
// One or two character tokens.
|
||||||
|
Bang,
|
||||||
|
BangEqual,
|
||||||
|
Equal,
|
||||||
|
EqualEqual,
|
||||||
|
Greater,
|
||||||
|
GreaterEqual,
|
||||||
|
Less,
|
||||||
|
LessEqual,
|
||||||
|
|
||||||
|
// Literals.
|
||||||
|
Identifier,
|
||||||
|
String,
|
||||||
|
Number,
|
||||||
|
|
||||||
|
// Keywords.
|
||||||
|
And,
|
||||||
|
Class,
|
||||||
|
Else,
|
||||||
|
False,
|
||||||
|
Fun,
|
||||||
|
For,
|
||||||
|
If,
|
||||||
|
Nil,
|
||||||
|
Or,
|
||||||
|
Print,
|
||||||
|
Return,
|
||||||
|
Super,
|
||||||
|
This,
|
||||||
|
True,
|
||||||
|
Var,
|
||||||
|
While,
|
||||||
|
|
||||||
|
Eof,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Display for crate::rlox::token_type::TokenType {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
match self {
|
||||||
|
// Single-character tokens.
|
||||||
|
TokenType::LeftParen=> write!(f, "LEFT_PAREN"),
|
||||||
|
TokenType::RightParen=> write!(f, "RIGHT_PAREN"),
|
||||||
|
TokenType::LeftBrace=> write!(f, "LEFT_BRACE"),
|
||||||
|
TokenType::RightBrace=> write!(f, "RIGHT_BRACE"),
|
||||||
|
TokenType::Comma=> write!(f, "COMMA"),
|
||||||
|
TokenType::Dot=> write!(f, "DOT"),
|
||||||
|
TokenType::Minus=> write!(f, "MINUS"),
|
||||||
|
TokenType::Plus=> write!(f, "PLUS"),
|
||||||
|
TokenType::Semicolon=> write!(f, "SEMICOLON"),
|
||||||
|
TokenType::Slash=> write!(f, "SLASH"),
|
||||||
|
TokenType::Star=> write!(f, "STAR"),
|
||||||
|
|
||||||
|
// One or two character tokens.
|
||||||
|
TokenType::Bang=> write!(f, "BANG"),
|
||||||
|
TokenType::BangEqual=> write!(f, "BANG_EQUAL"),
|
||||||
|
TokenType::Equal=> write!(f, "EQUAL"),
|
||||||
|
TokenType::EqualEqual=> write!(f, "EQUAL_EQUAL"),
|
||||||
|
TokenType::Greater=> write!(f, "GREATER"),
|
||||||
|
TokenType::GreaterEqual=> write!(f, "GREATER_EQUAL"),
|
||||||
|
TokenType::Less=> write!(f, "LESS"),
|
||||||
|
TokenType::LessEqual=> write!(f, "LESS_EQUAL"),
|
||||||
|
|
||||||
|
// Literals.
|
||||||
|
TokenType::Identifier=> write!(f, "IDENTIFIER"),
|
||||||
|
TokenType::String=> write!(f, "STRING"),
|
||||||
|
TokenType::Number=> write!(f, "NUMBER"),
|
||||||
|
|
||||||
|
// Keywords.
|
||||||
|
TokenType::And=> write!(f, "AND"),
|
||||||
|
TokenType::Class=> write!(f, "CLASS"),
|
||||||
|
TokenType::Else=> write!(f, "ELSE"),
|
||||||
|
TokenType::False=> write!(f, "FALSE"),
|
||||||
|
TokenType::Fun=> write!(f, "FUN"),
|
||||||
|
TokenType::For=> write!(f, "FOR"),
|
||||||
|
TokenType::If=> write!(f, "IF"),
|
||||||
|
TokenType::Nil=> write!(f, "NIL"),
|
||||||
|
TokenType::Or=> write!(f, "OR"),
|
||||||
|
TokenType::Print=> write!(f, "PRINT"),
|
||||||
|
TokenType::Return=> write!(f, "RETURN"),
|
||||||
|
TokenType::Super=> write!(f, "SUPER"),
|
||||||
|
TokenType::This=> write!(f, "THIS"),
|
||||||
|
TokenType::True=> write!(f, "TRUE"),
|
||||||
|
TokenType::Var=> write!(f, "VAR"),
|
||||||
|
TokenType::While=> write!(f, "WHILE"),
|
||||||
|
|
||||||
|
TokenType::Eof=> write!(f, "EOF"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user