85 lines
1.8 KiB
Rust
85 lines
1.8 KiB
Rust
use logos::{Lexer, Logos};
|
|
|
|
use crate::{WasmOperation, WasmType};
|
|
|
|
#[derive(Logos, Debug, PartialEq)]
|
|
pub enum Token {
|
|
#[token(".")]
|
|
Period,
|
|
|
|
#[token("(")]
|
|
RightParen,
|
|
|
|
#[token(")")]
|
|
LeftParen,
|
|
|
|
#[regex("[a-zA-Z_]+", keyword_parse)]
|
|
Keyword(String),
|
|
|
|
#[regex(r"\$[a-zA-Z]+", function_name_parse)]
|
|
FunctionName(String),
|
|
|
|
#[regex("add", operation_parser)]
|
|
Operation(WasmOperation),
|
|
|
|
#[regex(r##""[a-zA-Z]+""##)]
|
|
WasmString,
|
|
|
|
#[regex("[0-9]+", number_parse)]
|
|
/// A number without a type attatched
|
|
Number(u64),
|
|
|
|
#[regex("[ui][0-9]+", number_type_parse)]
|
|
NumberType(WasmType),
|
|
|
|
#[error]
|
|
#[regex(r"[ \t\n\f]+", logos::skip)]
|
|
Error,
|
|
}
|
|
|
|
fn number_parse(lex: &mut Lexer<Token>) -> Option<u64> {
|
|
let slice = lex.slice();
|
|
let n: u64 = slice.parse().ok()?;
|
|
Some(n)
|
|
}
|
|
|
|
fn number_type_parse(lex: &mut Lexer<Token>) -> Option<WasmType> {
|
|
let slice = lex.slice();
|
|
use WasmType::*;
|
|
match slice {
|
|
"i32" => Some(I32),
|
|
_ => None,
|
|
}
|
|
}
|
|
|
|
fn keyword_parse(lex: &mut Lexer<Token>) -> Option<String> {
|
|
let slice = lex.slice();
|
|
match slice {
|
|
"const" => Some(slice.to_string()),
|
|
"module" => Some(slice.to_string()),
|
|
"param" => Some(slice.to_string()),
|
|
"result" => Some(slice.to_string()),
|
|
"call" => Some(slice.to_string()),
|
|
"func" => Some(slice.to_string()),
|
|
"get_local" => Some(slice.to_string()),
|
|
"export" => Some(slice.to_string()),
|
|
|
|
_ => None,
|
|
}
|
|
}
|
|
|
|
fn operation_parser(lex: &mut Lexer<Token>) -> Option<WasmOperation> {
|
|
let slice = lex.slice();
|
|
use WasmOperation::*;
|
|
match slice {
|
|
"add" => Some(Add),
|
|
_ => None,
|
|
}
|
|
}
|
|
|
|
fn function_name_parse(lex: &mut Lexer<Token>) -> Option<String> {
|
|
let slice = lex.slice();
|
|
|
|
Some(slice.to_string())
|
|
}
|