add more tokens

This commit is contained in:
janis 2025-11-02 00:00:22 +01:00
parent 9cb3331f60
commit c0dc1361ae
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
3 changed files with 280 additions and 126 deletions

View file

@ -16,6 +16,7 @@ LEXEMES:
dq LEX_ARROW dq LEX_ARROW
dq LEX_I32 dq LEX_I32
dq LEX_U32 dq LEX_U32
dq LEX_EQEQ
dq LEX_EQUALS dq LEX_EQUALS
dq LEX_PLUS dq LEX_PLUS
dq LEX_MINUS dq LEX_MINUS
@ -23,12 +24,14 @@ LEXEMES:
dq LEX_LPARENS dq LEX_LPARENS
dq LEX_RBRACE dq LEX_RBRACE
dq LEX_LBRACE dq LEX_LBRACE
dq LEX_COLON2
dq LEX_COLON dq LEX_COLON
dq LEX_SEMI dq LEX_SEMI
dq LEX_COMMA dq LEX_COMMA
dq LEX_PIPE2
dq LEX_PIPE dq LEX_PIPE
dq LEX_AMP2
dq LEX_AMP dq LEX_AMP
dq LEX_EQEQ
dq LEX_LBRACKET dq LEX_LBRACKET
dq LEX_RBRACKET dq LEX_RBRACKET
dq LEX_VOID dq LEX_VOID
@ -44,6 +47,21 @@ LEXEMES:
dq LEX_ISIZE dq LEX_ISIZE
dq LEX_F32 dq LEX_F32
dq LEX_F64 dq LEX_F64
dq LEX_PERCENT
dq LEX_CARET
dq LEX_BANGEQ
dq LEX_BANG
dq LEX_TILDE
dq LEX_LEQ
dq LEX_GEQ
dq LEX_LESSLESS
dq LEX_GTGT
dq LEX_LT
dq LEX_GT
dq LEX_DOT3
dq LEX_DOT2
dq LEX_DOT
dq LEX_BACKTICK
align 8 align 8
TOKENS: TOKENS:
@ -62,6 +80,7 @@ TOKENS:
db TOKEN_ARROW ;; 12 db TOKEN_ARROW ;; 12
db TOKEN_I32 ;; 13 db TOKEN_I32 ;; 13
db TOKEN_U32 ;; 14 db TOKEN_U32 ;; 14
db TOKEN_EQEQ ;; 15
db TOKEN_EQUALS ;; 15 db TOKEN_EQUALS ;; 15
db TOKEN_PLUS ;; 16 db TOKEN_PLUS ;; 16
db TOKEN_MINUS ;; 17 db TOKEN_MINUS ;; 17
@ -69,12 +88,14 @@ TOKENS:
db TOKEN_LPARENS ;; 19 db TOKEN_LPARENS ;; 19
db TOKEN_RBRACE ;; 20 db TOKEN_RBRACE ;; 20
db TOKEN_LBRACE ;; 21 db TOKEN_LBRACE ;; 21
db TOKEN_COLON2 ;; 22
db TOKEN_COLON ;; 22 db TOKEN_COLON ;; 22
db TOKEN_SEMI ;; 23 db TOKEN_SEMI ;; 23
db TOKEN_COMMA ;; 24 db TOKEN_COMMA ;; 24
db TOKEN_PIPE2 ;; 25
db TOKEN_PIPE ;; 25 db TOKEN_PIPE ;; 25
db TOKEN_AMP2 ;; 26
db TOKEN_AMP ;; 26 db TOKEN_AMP ;; 26
db TOKEN_EQEQ ;; 27
db TOKEN_LBRACKET ;; 28 db TOKEN_LBRACKET ;; 28
db TOKEN_RBRACKET ;; 29 db TOKEN_RBRACKET ;; 29
db TOKEN_VOID ;; 30 db TOKEN_VOID ;; 30
@ -90,6 +111,21 @@ TOKENS:
db TOKEN_ISIZE ;; 40 db TOKEN_ISIZE ;; 40
db TOKEN_F32 ;; 41 db TOKEN_F32 ;; 41
db TOKEN_F64 ;; 42 db TOKEN_F64 ;; 42
db TOKEN_PERCENT ;; 43
db TOKEN_CARET ;; 44
db TOKEN_BANGEQ ;; 45
db TOKEN_BANG ;; 46
db TOKEN_TILDE ;; 47
db TOKEN_LEQ ;; 48
db TOKEN_GEQ ;; 49
db TOKEN_LESSLESS ;; 50
db TOKEN_GTGT ;; 51
db TOKEN_LT ;; 50
db TOKEN_GT ;; 51
db TOKEN_DOT3 ;; 54
db TOKEN_DOT2 ;; 53
db TOKEN_DOT ;; 52
db TOKEN_BACKTICK ;; 55
align 8 align 8
LEXEME_LENS: LEXEME_LENS:
@ -108,6 +144,7 @@ LEXEME_LENS:
dq LEX_ARROW_len dq LEX_ARROW_len
dq LEX_I32_len dq LEX_I32_len
dq LEX_U32_len dq LEX_U32_len
dq LEX_EQEQ_len
dq LEX_EQUALS_len dq LEX_EQUALS_len
dq LEX_PLUS_len dq LEX_PLUS_len
dq LEX_MINUS_len dq LEX_MINUS_len
@ -115,12 +152,14 @@ LEXEME_LENS:
dq LEX_LPARENS_len dq LEX_LPARENS_len
dq LEX_RBRACE_len dq LEX_RBRACE_len
dq LEX_LBRACE_len dq LEX_LBRACE_len
dq LEX_COLON2_len
dq LEX_COLON_len dq LEX_COLON_len
dq LEX_SEMI_len dq LEX_SEMI_len
dq LEX_COMMA_len dq LEX_COMMA_len
dq LEX_PIPE2_len
dq LEX_PIPE_len dq LEX_PIPE_len
dq LEX_AMP2_len
dq LEX_AMP_len dq LEX_AMP_len
dq LEX_EQEQ_len
dq LEX_LBRACKET_len dq LEX_LBRACKET_len
dq LEX_RBRACKET_len dq LEX_RBRACKET_len
dq LEX_VOID_len dq LEX_VOID_len
@ -136,9 +175,24 @@ LEXEME_LENS:
dq LEX_ISIZE_len dq LEX_ISIZE_len
dq LEX_F32_len dq LEX_F32_len
dq LEX_F64_len dq LEX_F64_len
dq LEX_PERCENT_len
dq LEX_CARET_len
dq LEX_BANGEQ_len
dq LEX_BANG_len
dq LEX_TILDE_len
dq LEX_LEQ_len
dq LEX_GEQ_len
dq LEX_LESSLESS_len
dq LEX_GTGT_len
dq LEX_LT_len
dq LEX_GT_len
dq LEX_DOT3_len
dq LEX_DOT2_len
dq LEX_DOT_len
dq LEX_BACKTICK_len
align 8 align 8
NUM_LEXEMES: dq 43 NUM_LEXEMES: dq 61
LEX_NOT_A_LEXEME db "<not a lexeme>", 0 LEX_NOT_A_LEXEME db "<not a lexeme>", 0
LEX_LET db "let" LEX_LET db "let"
@ -169,6 +223,8 @@ NUM_LEXEMES: dq 43
LEX_I32_len equ $ - LEX_I32 LEX_I32_len equ $ - LEX_I32
LEX_U32 db "u32" LEX_U32 db "u32"
LEX_U32_len equ $ - LEX_U32 LEX_U32_len equ $ - LEX_U32
LEX_EQEQ db "=="
LEX_EQEQ_len equ $ - LEX_EQEQ
LEX_EQUALS db "=" LEX_EQUALS db "="
LEX_EQUALS_len equ $ - LEX_EQUALS LEX_EQUALS_len equ $ - LEX_EQUALS
LEX_PLUS db "+" LEX_PLUS db "+"
@ -183,18 +239,22 @@ NUM_LEXEMES: dq 43
LEX_RBRACE_len equ $ - LEX_RBRACE LEX_RBRACE_len equ $ - LEX_RBRACE
LEX_LBRACE db "{" LEX_LBRACE db "{"
LEX_LBRACE_len equ $ - LEX_LBRACE LEX_LBRACE_len equ $ - LEX_LBRACE
LEX_COLON2 db "::"
LEX_COLON2_len equ $ - LEX_COLON2
LEX_COLON db ":" LEX_COLON db ":"
LEX_COLON_len equ $ - LEX_COLON LEX_COLON_len equ $ - LEX_COLON
LEX_SEMI db ";" LEX_SEMI db ";"
LEX_SEMI_len equ $ - LEX_SEMI LEX_SEMI_len equ $ - LEX_SEMI
LEX_COMMA db "," LEX_COMMA db ","
LEX_COMMA_len equ $ - LEX_COMMA LEX_COMMA_len equ $ - LEX_COMMA
LEX_PIPE2 db "||"
LEX_PIPE2_len equ $ - LEX_PIPE2
LEX_PIPE db "|" LEX_PIPE db "|"
LEX_PIPE_len equ $ - LEX_PIPE LEX_PIPE_len equ $ - LEX_PIPE
LEX_AMP2 db "&&"
LEX_AMP2_len equ $ - LEX_AMP2
LEX_AMP db "&" LEX_AMP db "&"
LEX_AMP_len equ $ - LEX_AMP LEX_AMP_len equ $ - LEX_AMP
LEX_EQEQ db "=="
LEX_EQEQ_len equ $ - LEX_EQEQ
LEX_LBRACKET db "[" LEX_LBRACKET db "["
LEX_LBRACKET_len equ $ - LEX_LBRACKET LEX_LBRACKET_len equ $ - LEX_LBRACKET
LEX_RBRACKET db "]" LEX_RBRACKET db "]"
@ -225,6 +285,36 @@ NUM_LEXEMES: dq 43
LEX_F32_len equ $ - LEX_F32 LEX_F32_len equ $ - LEX_F32
LEX_F64 db "f64" LEX_F64 db "f64"
LEX_F64_len equ $ - LEX_F64 LEX_F64_len equ $ - LEX_F64
LEX_PERCENT db "%"
LEX_PERCENT_len equ $ - LEX_PERCENT
LEX_CARET db "^"
LEX_CARET_len equ $ - LEX_CARET
LEX_BANGEQ db "!="
LEX_BANGEQ_len equ $ - LEX_BANGEQ
LEX_BANG db "!"
LEX_BANG_len equ $ - LEX_BANG
LEX_TILDE db "~"
LEX_TILDE_len equ $ - LEX_TILDE
LEX_LEQ db "<="
LEX_LEQ_len equ $ - LEX_LEQ
LEX_GEQ db ">="
LEX_GEQ_len equ $ - LEX_GEQ
LEX_LESSLESS db "<<"
LEX_LESSLESS_len equ $ - LEX_LESSLESS
LEX_GTGT db ">>"
LEX_GTGT_len equ $ - LEX_GTGT
LEX_LT db "<"
LEX_LT_len equ $ - LEX_LT
LEX_GT db ">"
LEX_GT_len equ $ - LEX_GT
LEX_DOT3 db "..."
LEX_DOT3_len equ $ - LEX_DOT3
LEX_DOT2 db ".."
LEX_DOT2_len equ $ - LEX_DOT2
LEX_DOT db "."
LEX_DOT_len equ $ - LEX_DOT
LEX_BACKTICK db "`"
LEX_BACKTICK_len equ $ - LEX_BACKTICK
LEX_IDENT db "<identifier>" LEX_IDENT db "<identifier>"
LEX_IDENT_len equ $ - LEX_IDENT LEX_IDENT_len equ $ - LEX_IDENT
LEX_NUMBER db "<number>" LEX_NUMBER db "<number>"
@ -250,36 +340,54 @@ NUM_LEXEMES: dq 43
TOKEN_ARROW equ 12 ; :u8 TOKEN_ARROW equ 12 ; :u8
TOKEN_I32 equ 13 ; :u8 TOKEN_I32 equ 13 ; :u8
TOKEN_U32 equ 14 ; :u8 TOKEN_U32 equ 14 ; :u8
TOKEN_EQUALS equ 15 ; :u8 TOKEN_EQEQ equ 15 ; :u8
TOKEN_PLUS equ 16 ; :u8 TOKEN_EQUALS equ 16 ; :u8
TOKEN_MINUS equ 17 ; :u8 TOKEN_PLUS equ 17 ; :u8
TOKEN_RPARENS equ 18 ; :u8 TOKEN_MINUS equ 18 ; :u8
TOKEN_LPARENS equ 19 ; :u8 TOKEN_RPARENS equ 19 ; :u8
TOKEN_RBRACE equ 20 ; :u8 TOKEN_LPARENS equ 20 ; :u8
TOKEN_LBRACE equ 21 ; :u8 TOKEN_RBRACE equ 21 ; :u8
TOKEN_COLON equ 22 ; :u8 TOKEN_LBRACE equ 22 ; :u8
TOKEN_SEMI equ 23 ; :u8 TOKEN_COLON equ 23 ; :u8
TOKEN_COMMA equ 24 ; :u8 TOKEN_COLON2 equ 24 ; :u8
TOKEN_PIPE equ 25 ; :u8 TOKEN_SEMI equ 25 ; :u8
TOKEN_AMP equ 26 ; :u8 TOKEN_COMMA equ 26 ; :u8
TOKEN_EQEQ equ 27 ; :u8 TOKEN_PIPE equ 27 ; :u8
TOKEN_LBRACKET equ 28 ; :u8 TOKEN_PIPE2 equ 28 ; :u8
TOKEN_RBRACKET equ 29 ; :u8 TOKEN_AMP equ 29 ; :u8
TOKEN_VOID equ 30 ; :u8 TOKEN_AMP2 equ 30 ; :u8
TOKEN_SLASH equ 31 ; :u8 TOKEN_LBRACKET equ 31 ; :u8
TOKEN_STAR equ 32 ; :u8 TOKEN_RBRACKET equ 32 ; :u8
TOKEN_U8 equ 33 ; :u8 TOKEN_VOID equ 33 ; :u8
TOKEN_I8 equ 34 ; :u8 TOKEN_SLASH equ 34 ; :u8
TOKEN_U16 equ 35 ; :u8 TOKEN_STAR equ 35 ; :u8
TOKEN_I16 equ 36 ; :u8 TOKEN_U8 equ 36 ; :u8
TOKEN_U64 equ 37 ; :u8 TOKEN_I8 equ 37 ; :u8
TOKEN_I64 equ 38 ; :u8 TOKEN_U16 equ 38 ; :u8
TOKEN_USIZE equ 39 ; :u8 TOKEN_I16 equ 39 ; :u8
TOKEN_ISIZE equ 40 ; :u8 TOKEN_U64 equ 40 ; :u8
TOKEN_F32 equ 41 ; :u8 TOKEN_I64 equ 41 ; :u8
TOKEN_F64 equ 42 ; :u8 TOKEN_USIZE equ 42 ; :u8
TOKEN_IDENT equ 43 ; :u8 TOKEN_ISIZE equ 43 ; :u8
TOKEN_NUMBER equ 44 ; :u8 TOKEN_F32 equ 44 ; :u8
TOKEN_STRING equ 45 ; :u8 TOKEN_F64 equ 45 ; :u8
TOKEN_COMMENT equ 46 ; :u8 TOKEN_PERCENT equ 46 ; :u8
TOKEN_CARET equ 47 ; :u8
TOKEN_BANGEQ equ 48 ; :u8
TOKEN_BANG equ 49 ; :u8
TOKEN_TILDE equ 50 ; :u8
TOKEN_LEQ equ 51 ; :u8
TOKEN_GEQ equ 52 ; :u8
TOKEN_LESSLESS equ 53 ; :u8
TOKEN_GTGT equ 54 ; :u8
TOKEN_LT equ 55 ; :u8
TOKEN_GT equ 56 ; :u8
TOKEN_DOT3 equ 57 ; :u8
TOKEN_DOT2 equ 58 ; :u8
TOKEN_DOT equ 59 ; :u8
TOKEN_BACKTICK equ 60 ; :u8
TOKEN_IDENT equ 61 ; :u8
TOKEN_NUMBER equ 62 ; :u8
TOKEN_STRING equ 63 ; :u8
TOKEN_COMMENT equ 64 ; :u8
;; end-consts ;; end-consts

View file

@ -24,6 +24,7 @@ unsafe extern "C" {
pub unsafe fn codegen_allocate_value(ctx: *mut FunctionCtx, width: u16) -> Operand; pub unsafe fn codegen_allocate_value(ctx: *mut FunctionCtx, width: u16) -> Operand;
pub unsafe fn codegen_free_operand(ctx: *mut FunctionCtx, operand: *const Operand) -> (); pub unsafe fn codegen_free_operand(ctx: *mut FunctionCtx, operand: *const Operand) -> ();
pub unsafe fn codegen_function(ast: *const CodegenCtx, func_idx: u64) -> (); pub unsafe fn codegen_function(ast: *const CodegenCtx, func_idx: u64) -> ();
pub unsafe fn codegen_push_pop_used_registers(text: *mut Vec<u8>, function_ctx: &FunctionCtx, pop: bool) -> u8;
pub unsafe fn codegen_expr(ctx: *const CodegenCtx, function_ctx: &FunctionCtx, expr_idx: u64) -> (u64, bool); pub unsafe fn codegen_expr(ctx: *const CodegenCtx, function_ctx: &FunctionCtx, expr_idx: u64) -> (u64, bool);
pub unsafe fn vec_insert_many(vec: *mut BlobVec, index: usize, data: *const u8, count: usize); pub unsafe fn vec_insert_many(vec: *mut BlobVec, index: usize, data: *const u8, count: usize);
pub unsafe fn vec_extend(vec: *mut BlobVec, elements: *const u8, count: usize) -> (); pub unsafe fn vec_extend(vec: *mut BlobVec, elements: *const u8, count: usize) -> ();
@ -78,38 +79,56 @@ pub const TOKEN_BOOL: u8 = 11;
pub const TOKEN_ARROW: u8 = 12; pub const TOKEN_ARROW: u8 = 12;
pub const TOKEN_I32: u8 = 13; pub const TOKEN_I32: u8 = 13;
pub const TOKEN_U32: u8 = 14; pub const TOKEN_U32: u8 = 14;
pub const TOKEN_EQUALS: u8 = 15; pub const TOKEN_EQEQ: u8 = 15;
pub const TOKEN_PLUS: u8 = 16; pub const TOKEN_EQUALS: u8 = 16;
pub const TOKEN_MINUS: u8 = 17; pub const TOKEN_PLUS: u8 = 17;
pub const TOKEN_RPARENS: u8 = 18; pub const TOKEN_MINUS: u8 = 18;
pub const TOKEN_LPARENS: u8 = 19; pub const TOKEN_RPARENS: u8 = 19;
pub const TOKEN_RBRACE: u8 = 20; pub const TOKEN_LPARENS: u8 = 20;
pub const TOKEN_LBRACE: u8 = 21; pub const TOKEN_RBRACE: u8 = 21;
pub const TOKEN_COLON: u8 = 22; pub const TOKEN_LBRACE: u8 = 22;
pub const TOKEN_SEMI: u8 = 23; pub const TOKEN_COLON: u8 = 23;
pub const TOKEN_COMMA: u8 = 24; pub const TOKEN_COLON2: u8 = 24;
pub const TOKEN_PIPE: u8 = 25; pub const TOKEN_SEMI: u8 = 25;
pub const TOKEN_AMP: u8 = 26; pub const TOKEN_COMMA: u8 = 26;
pub const TOKEN_EQEQ: u8 = 27; pub const TOKEN_PIPE: u8 = 27;
pub const TOKEN_LBRACKET: u8 = 28; pub const TOKEN_PIPE2: u8 = 28;
pub const TOKEN_RBRACKET: u8 = 29; pub const TOKEN_AMP: u8 = 29;
pub const TOKEN_VOID: u8 = 30; pub const TOKEN_AMP2: u8 = 30;
pub const TOKEN_SLASH: u8 = 31; pub const TOKEN_LBRACKET: u8 = 31;
pub const TOKEN_STAR: u8 = 32; pub const TOKEN_RBRACKET: u8 = 32;
pub const TOKEN_U8: u8 = 33; pub const TOKEN_VOID: u8 = 33;
pub const TOKEN_I8: u8 = 34; pub const TOKEN_SLASH: u8 = 34;
pub const TOKEN_U16: u8 = 35; pub const TOKEN_STAR: u8 = 35;
pub const TOKEN_I16: u8 = 36; pub const TOKEN_U8: u8 = 36;
pub const TOKEN_U64: u8 = 37; pub const TOKEN_I8: u8 = 37;
pub const TOKEN_I64: u8 = 38; pub const TOKEN_U16: u8 = 38;
pub const TOKEN_USIZE: u8 = 39; pub const TOKEN_I16: u8 = 39;
pub const TOKEN_ISIZE: u8 = 40; pub const TOKEN_U64: u8 = 40;
pub const TOKEN_F32: u8 = 41; pub const TOKEN_I64: u8 = 41;
pub const TOKEN_F64: u8 = 42; pub const TOKEN_USIZE: u8 = 42;
pub const TOKEN_IDENT: u8 = 43; pub const TOKEN_ISIZE: u8 = 43;
pub const TOKEN_NUMBER: u8 = 44; pub const TOKEN_F32: u8 = 44;
pub const TOKEN_STRING: u8 = 45; pub const TOKEN_F64: u8 = 45;
pub const TOKEN_COMMENT: u8 = 46; pub const TOKEN_PERCENT: u8 = 46;
pub const TOKEN_CARET: u8 = 47;
pub const TOKEN_BANGEQ: u8 = 48;
pub const TOKEN_BANG: u8 = 49;
pub const TOKEN_TILDE: u8 = 50;
pub const TOKEN_LEQ: u8 = 51;
pub const TOKEN_GEQ: u8 = 52;
pub const TOKEN_LESSLESS: u8 = 53;
pub const TOKEN_GTGT: u8 = 54;
pub const TOKEN_LT: u8 = 55;
pub const TOKEN_GT: u8 = 56;
pub const TOKEN_DOT3: u8 = 57;
pub const TOKEN_DOT2: u8 = 58;
pub const TOKEN_DOT: u8 = 59;
pub const TOKEN_BACKTICK: u8 = 60;
pub const TOKEN_IDENT: u8 = 61;
pub const TOKEN_NUMBER: u8 = 62;
pub const TOKEN_STRING: u8 = 63;
pub const TOKEN_COMMENT: u8 = 64;
#[repr(C)] #[repr(C)]
#[derive(Debug)] #[derive(Debug)]

View file

@ -8,9 +8,10 @@ struct Lexeme(u8, &'static str);
impl PartialEq for Lexeme { impl PartialEq for Lexeme {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
use util::defs::{TOKEN_IDENT, TOKEN_NUMBER};
match self.0 { match self.0 {
// Identifiers and numbers compare both token and lexeme // Identifiers and numbers compare both token and lexeme
30 | 31 => self.0 == other.0 && self.1 == other.1, TOKEN_IDENT | TOKEN_NUMBER => self.0 == other.0 && self.1 == other.1,
_ => self.0 == other.0, _ => self.0 == other.0,
} }
} }
@ -115,17 +116,17 @@ fn main() {
assert_eq!( assert_eq!(
&collect_tokens()[..], &collect_tokens()[..],
&[ &[
Lexeme(19, ""), Lexeme(TOKEN_LPARENS, ""),
Lexeme(18, ""), Lexeme(TOKEN_RPARENS, ""),
Lexeme(28, ""), Lexeme(TOKEN_LBRACKET, ""),
Lexeme(29, ""), Lexeme(TOKEN_RBRACKET, ""),
Lexeme(21, ""), Lexeme(TOKEN_LBRACE, ""),
Lexeme(20, ""), Lexeme(TOKEN_RBRACE, ""),
Lexeme(24, ""), Lexeme(TOKEN_COMMA, ""),
Lexeme(12, ""), Lexeme(TOKEN_ARROW, ""),
Lexeme(23, ""), Lexeme(TOKEN_SEMI, ""),
Lexeme(22, ""), Lexeme(TOKEN_COLON, ""),
Lexeme(15, ""), Lexeme(TOKEN_EQUALS, ""),
][..] ][..]
); );
@ -143,7 +144,7 @@ fn main() {
Lexeme(TOKEN_IDENT, "number12345"), Lexeme(TOKEN_IDENT, "number12345"),
Lexeme(TOKEN_IDENT, "____"), Lexeme(TOKEN_IDENT, "____"),
Lexeme(TOKEN_IDENT, "_"), Lexeme(TOKEN_IDENT, "_"),
Lexeme(17, ""), Lexeme(TOKEN_MINUS, ""),
Lexeme(TOKEN_IDENT, "leading-minus"), Lexeme(TOKEN_IDENT, "leading-minus"),
Lexeme(TOKEN_IDENT, "trailing-minus-"), Lexeme(TOKEN_IDENT, "trailing-minus-"),
] ]
@ -156,17 +157,17 @@ fn main() {
assert_eq!( assert_eq!(
&collect_tokens()[..], &collect_tokens()[..],
&[ &[
Lexeme(4, ""), Lexeme(TOKEN_FN, ""),
Lexeme(TOKEN_IDENT, "my-function"), Lexeme(TOKEN_IDENT, "my-function"),
Lexeme(19, ""), Lexeme(TOKEN_LPARENS, ""),
Lexeme(18, ""), Lexeme(TOKEN_RPARENS, ""),
Lexeme(12, ""), Lexeme(TOKEN_ARROW, ""),
Lexeme(11, ""), Lexeme(TOKEN_BOOL, ""),
Lexeme(21, ""), Lexeme(TOKEN_LBRACE, ""),
Lexeme(5, ""), Lexeme(TOKEN_RETURN, ""),
Lexeme(10, ""), Lexeme(TOKEN_FALSE, ""),
Lexeme(23, ""), Lexeme(TOKEN_SEMI, ""),
Lexeme(20, ""), Lexeme(TOKEN_RBRACE, ""),
] ]
); );
@ -174,8 +175,8 @@ fn main() {
tokeniser_init(c"tests/tokens/function.l".as_ptr()); tokeniser_init(c"tests/tokens/function.l".as_ptr());
eprintln!("ok."); eprintln!("ok.");
assert_eq!(expect_token(2).into_option(), None); assert_eq!(expect_token(TOKEN_IF).into_option(), None);
assert_eq!(expect_token(4).into_option().unwrap().as_str(), "fn"); assert_eq!(expect_token(TOKEN_FN).into_option().unwrap().as_str(), "fn");
assert_eq!(unwrap_token(TOKEN_IDENT).as_str(), "my-function"); assert_eq!(unwrap_token(TOKEN_IDENT).as_str(), "my-function");
eprint!("Initializing tokeniser.. "); eprint!("Initializing tokeniser.. ");
@ -186,18 +187,18 @@ fn main() {
&collect_tokens()[..], &collect_tokens()[..],
&[ &[
Lexeme(TOKEN_COMMENT, ""), Lexeme(TOKEN_COMMENT, ""),
Lexeme(4, ""), Lexeme(TOKEN_FN, ""),
Lexeme(TOKEN_IDENT, "my-function"), Lexeme(TOKEN_IDENT, "my-function"),
Lexeme(19, ""), Lexeme(TOKEN_LPARENS, ""),
Lexeme(18, ""), Lexeme(TOKEN_RPARENS, ""),
Lexeme(12, ""), Lexeme(TOKEN_ARROW, ""),
Lexeme(11, ""), Lexeme(TOKEN_BOOL, ""),
Lexeme(21, ""), Lexeme(TOKEN_LBRACE, ""),
Lexeme(TOKEN_COMMENT, ""), Lexeme(TOKEN_COMMENT, ""),
Lexeme(5, ""), Lexeme(TOKEN_RETURN, ""),
Lexeme(10, ""), Lexeme(TOKEN_FALSE, ""),
Lexeme(23, ""), Lexeme(TOKEN_SEMI, ""),
Lexeme(20, ""), Lexeme(TOKEN_RBRACE, ""),
] ]
); );
@ -243,7 +244,7 @@ fn main() {
&collect_tokens()[..], &collect_tokens()[..],
&[ &[
Lexeme(TOKEN_NUMBER, "3"), Lexeme(TOKEN_NUMBER, "3"),
Lexeme(16, "+"), Lexeme(TOKEN_PLUS, "+"),
Lexeme(TOKEN_NUMBER, "4") Lexeme(TOKEN_NUMBER, "4")
], ],
); );
@ -256,19 +257,19 @@ fn main() {
assert_eq!( assert_eq!(
&collect_tokens()[..], &collect_tokens()[..],
&[ &[
Lexeme(4, "fn"), Lexeme(TOKEN_FN, "fn"),
Lexeme(TOKEN_IDENT, "main"), Lexeme(TOKEN_IDENT, "main"),
Lexeme(19, "("), Lexeme(TOKEN_LPARENS, "("),
Lexeme(18, ")"), Lexeme(TOKEN_RPARENS, ")"),
Lexeme(12, "->"), Lexeme(TOKEN_ARROW, "->"),
Lexeme(30, "void"), Lexeme(TOKEN_VOID, "void"),
Lexeme(21, "{"), Lexeme(TOKEN_LBRACE, "{"),
Lexeme(5, "return"), Lexeme(TOKEN_RETURN, "return"),
Lexeme(TOKEN_NUMBER, "1"), Lexeme(TOKEN_NUMBER, "1"),
Lexeme(16, "+"), Lexeme(TOKEN_PLUS, "+"),
Lexeme(TOKEN_NUMBER, "2"), Lexeme(TOKEN_NUMBER, "2"),
Lexeme(23, ";"), Lexeme(TOKEN_SEMI, ";"),
Lexeme(20, "}"), Lexeme(TOKEN_RBRACE, "}"),
], ],
); );
@ -280,16 +281,42 @@ fn main() {
assert_eq!( assert_eq!(
&collect_tokens()[..], &collect_tokens()[..],
&[ &[
Lexeme(19, "("), Lexeme(TOKEN_LPARENS, "("),
Lexeme(33, "b"), Lexeme(TOKEN_IDENT, "b"),
Lexeme(31, "/"), Lexeme(TOKEN_SLASH, "/"),
Lexeme(33, "d"), Lexeme(TOKEN_IDENT, "d"),
Lexeme(16, "+"), Lexeme(TOKEN_PLUS, "+"),
Lexeme(33, "c"), Lexeme(TOKEN_IDENT, "c"),
Lexeme(18, ")"), Lexeme(TOKEN_RPARENS, ")"),
Lexeme(32, "*"), Lexeme(TOKEN_STAR, "*"),
Lexeme(34, "42"), Lexeme(TOKEN_NUMBER, "42"),
Lexeme(23, ";") Lexeme(TOKEN_SEMI, ";")
],
);
eprint!("Initializing tokeniser.. ");
let src = b"<<<=<a == b = c ||| &||&&|&";
tokeniser_init_buf(src.as_ptr(), src.len());
eprintln!("ok.");
assert_eq!(
&collect_tokens()[..],
&[
Lexeme(TOKEN_LESSLESS, ""),
Lexeme(TOKEN_LEQ, ""),
Lexeme(TOKEN_LT, ""),
Lexeme(TOKEN_IDENT, "a"),
Lexeme(TOKEN_EQEQ, ""),
Lexeme(TOKEN_IDENT, "b"),
Lexeme(TOKEN_EQUALS, ""),
Lexeme(TOKEN_IDENT, "c"),
Lexeme(TOKEN_PIPE2, ""),
Lexeme(TOKEN_PIPE, ""),
Lexeme(TOKEN_AMP, ""),
Lexeme(TOKEN_PIPE2, ""),
Lexeme(TOKEN_AMP2, ""),
Lexeme(TOKEN_PIPE, ""),
Lexeme(TOKEN_AMP, ""),
], ],
); );