Merge pull request #2 from xquantxz/wip/lexer-info

Add line and column counting
This commit is contained in:
Leo dev
2024-04-03 16:59:50 +02:00
committed by GitHub
+24 -4
View File
@@ -2,6 +2,11 @@ use regex::Regex;
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
use std::fmt; use std::fmt;
pub struct LexerState {
line: usize,
column: usize
}
// Define token types // Define token types
#[derive(Debug, PartialEq, Clone, Copy)] #[derive(Debug, PartialEq, Clone, Copy)]
pub enum TokenType { pub enum TokenType {
@@ -20,12 +25,14 @@ pub enum TokenType {
#[derive(Clone)] #[derive(Clone)]
pub struct Token { pub struct Token {
pub token_type: TokenType, pub token_type: TokenType,
pub token_values: Vec<String> pub token_values: Vec<String>,
pub line: usize,
pub column: usize
} }
impl<'a> fmt::Debug for Token { impl<'a> fmt::Debug for Token {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "(TokenType: {:?}, TokenValue: {})", self.token_type, self.token_values.join(", ")) write!(f, "(TokenType: {:?}, TokenValue: {}, Line: {}, Column {})", self.token_type, self.token_values.join(", "), self.line, self.column)
} }
} }
@@ -37,7 +44,7 @@ pub struct Node {
const SYNTAX: [Node; 9] = [ const SYNTAX: [Node; 9] = [
Node { Node {
token_type: TokenType::Newline, token_type: TokenType::Newline,
token_regex: Lazy::new(|| Regex::new(r"^\n+").unwrap()) token_regex: Lazy::new(|| Regex::new(r"^\n+").unwrap()),
}, },
Node { Node {
token_type: TokenType::Whitespace, token_type: TokenType::Whitespace,
@@ -49,7 +56,7 @@ const SYNTAX: [Node; 9] = [
}, },
Node { Node {
token_type: TokenType::Keyword, token_type: TokenType::Keyword,
token_regex: Lazy::new(|| Regex::new(r"^if|mut|try|catch|return|fn").unwrap()) token_regex: Lazy::new(|| Regex::new(r"^mut|try|catch|return|fn").unwrap())
}, },
Node { Node {
token_type: TokenType::Identifier, token_type: TokenType::Identifier,
@@ -74,7 +81,9 @@ const SYNTAX: [Node; 9] = [
]; ];
pub fn lex(mut code: &str, use_whitespace: bool) -> Vec<Token> { pub fn lex(mut code: &str, use_whitespace: bool) -> Vec<Token> {
let mut state = LexerState { line: 1, column: 1 };
let mut tokens: Vec<Token> = Vec::new(); let mut tokens: Vec<Token> = Vec::new();
while !code.is_empty() { while !code.is_empty() {
let mut is_match = false; let mut is_match = false;
for s in &SYNTAX { for s in &SYNTAX {
@@ -88,12 +97,23 @@ pub fn lex(mut code: &str, use_whitespace: bool) -> Vec<Token> {
vcaps.push(caps[x].to_string()); vcaps.push(caps[x].to_string());
x+=1; x+=1;
} }
if (!use_whitespace && s.token_type!=TokenType::Whitespace) || use_whitespace { if (!use_whitespace && s.token_type!=TokenType::Whitespace) || use_whitespace {
tokens.push(Token { tokens.push(Token {
token_type: s.token_type, token_type: s.token_type,
token_values: vcaps, token_values: vcaps,
line: state.line,
column: state.column
}); });
} }
match s.token_type {
TokenType::Newline => {
state.line += caps[0].len();
state.column = 1;
},
_ => { state.column += caps[0].len(); }
}
} else { } else {
continue; continue;
}; };