ableos_userland/programs/wat2wasm/src/tokenizer/mod.rs

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())
}