Pick this up again, dust it off, get some stuff connected.
This commit is contained in:
@@ -1,18 +1,17 @@
|
||||
use crate::util::istring::InternedString;
|
||||
use logos::{Lexer, Logos};
|
||||
use std::fmt;
|
||||
use std::num::ParseIntError;
|
||||
|
||||
#[derive(Logos, Clone, Debug, PartialEq)]
|
||||
pub enum Token {
|
||||
#[regex(r"[ \t\n\f]+", logos::skip)]
|
||||
#[regex(r"//.*", logos::skip)]
|
||||
#[token("=")]
|
||||
Equals,
|
||||
|
||||
#[token(";")]
|
||||
Semi,
|
||||
|
||||
#[regex(r"[+\-*/]", |v| v.slice().chars().nth(0))]
|
||||
#[regex(r"[+\-*/]", |v| v.slice().chars().next())]
|
||||
Operator(char),
|
||||
|
||||
#[regex(r"0b[01]+", |v| parse_number(Some(2), v))]
|
||||
@@ -26,9 +25,29 @@ pub enum Token {
|
||||
Variable(InternedString),
|
||||
|
||||
#[error]
|
||||
#[regex(r"[ \t\r\n\f]+", logos::skip)]
|
||||
#[regex(r"//.*", logos::skip)]
|
||||
Error,
|
||||
}
|
||||
|
||||
impl fmt::Display for Token {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
match self {
|
||||
Token::Equals => write!(f, "'='"),
|
||||
Token::Semi => write!(f, "';'"),
|
||||
Token::Operator(c) => write!(f, "'{}'", c),
|
||||
Token::Number((None, v)) => write!(f, "'{}'", v),
|
||||
Token::Number((Some(2), v)) => write!(f, "'0b{:b}'", v),
|
||||
Token::Number((Some(8), v)) => write!(f, "'0o{:o}'", v),
|
||||
Token::Number((Some(10), v)) => write!(f, "'{}'", v),
|
||||
Token::Number((Some(16), v)) => write!(f, "'0x{:x}'", v),
|
||||
Token::Number((Some(b), v)) => write!(f, "Invalidly-based-number<base={},val={}>", b, v),
|
||||
Token::Variable(s) => write!(f, "'{}'", s),
|
||||
Token::Error => write!(f, "<error>"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
impl Token {
|
||||
pub(crate) fn var(s: &str) -> Token {
|
||||
@@ -36,9 +55,9 @@ impl Token {
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_number<'a, 'src>(
|
||||
fn parse_number(
|
||||
base: Option<u8>,
|
||||
value: &'a Lexer<'src, Token>,
|
||||
value: &Lexer<Token>,
|
||||
) -> Result<(Option<u8>, i128), ParseIntError> {
|
||||
let (radix, strval) = match base {
|
||||
None => (10, value.slice()),
|
||||
|
||||
Reference in New Issue
Block a user