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_I32
dq LEX_U32
dq LEX_EQEQ
dq LEX_EQUALS
dq LEX_PLUS
dq LEX_MINUS
@ -23,12 +24,14 @@ LEXEMES:
dq LEX_LPARENS
dq LEX_RBRACE
dq LEX_LBRACE
dq LEX_COLON2
dq LEX_COLON
dq LEX_SEMI
dq LEX_COMMA
dq LEX_PIPE2
dq LEX_PIPE
dq LEX_AMP2
dq LEX_AMP
dq LEX_EQEQ
dq LEX_LBRACKET
dq LEX_RBRACKET
dq LEX_VOID
@ -44,6 +47,21 @@ LEXEMES:
dq LEX_ISIZE
dq LEX_F32
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
TOKENS:
@ -62,6 +80,7 @@ TOKENS:
db TOKEN_ARROW ;; 12
db TOKEN_I32 ;; 13
db TOKEN_U32 ;; 14
db TOKEN_EQEQ ;; 15
db TOKEN_EQUALS ;; 15
db TOKEN_PLUS ;; 16
db TOKEN_MINUS ;; 17
@ -69,12 +88,14 @@ TOKENS:
db TOKEN_LPARENS ;; 19
db TOKEN_RBRACE ;; 20
db TOKEN_LBRACE ;; 21
db TOKEN_COLON2 ;; 22
db TOKEN_COLON ;; 22
db TOKEN_SEMI ;; 23
db TOKEN_COMMA ;; 24
db TOKEN_PIPE2 ;; 25
db TOKEN_PIPE ;; 25
db TOKEN_AMP2 ;; 26
db TOKEN_AMP ;; 26
db TOKEN_EQEQ ;; 27
db TOKEN_LBRACKET ;; 28
db TOKEN_RBRACKET ;; 29
db TOKEN_VOID ;; 30
@ -90,6 +111,21 @@ TOKENS:
db TOKEN_ISIZE ;; 40
db TOKEN_F32 ;; 41
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
LEXEME_LENS:
@ -108,6 +144,7 @@ LEXEME_LENS:
dq LEX_ARROW_len
dq LEX_I32_len
dq LEX_U32_len
dq LEX_EQEQ_len
dq LEX_EQUALS_len
dq LEX_PLUS_len
dq LEX_MINUS_len
@ -115,12 +152,14 @@ LEXEME_LENS:
dq LEX_LPARENS_len
dq LEX_RBRACE_len
dq LEX_LBRACE_len
dq LEX_COLON2_len
dq LEX_COLON_len
dq LEX_SEMI_len
dq LEX_COMMA_len
dq LEX_PIPE2_len
dq LEX_PIPE_len
dq LEX_AMP2_len
dq LEX_AMP_len
dq LEX_EQEQ_len
dq LEX_LBRACKET_len
dq LEX_RBRACKET_len
dq LEX_VOID_len
@ -136,9 +175,24 @@ LEXEME_LENS:
dq LEX_ISIZE_len
dq LEX_F32_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
NUM_LEXEMES: dq 43
NUM_LEXEMES: dq 61
LEX_NOT_A_LEXEME db "<not a lexeme>", 0
LEX_LET db "let"
@ -169,6 +223,8 @@ NUM_LEXEMES: dq 43
LEX_I32_len equ $ - LEX_I32
LEX_U32 db "u32"
LEX_U32_len equ $ - LEX_U32
LEX_EQEQ db "=="
LEX_EQEQ_len equ $ - LEX_EQEQ
LEX_EQUALS db "="
LEX_EQUALS_len equ $ - LEX_EQUALS
LEX_PLUS db "+"
@ -183,18 +239,22 @@ NUM_LEXEMES: dq 43
LEX_RBRACE_len equ $ - LEX_RBRACE
LEX_LBRACE db "{"
LEX_LBRACE_len equ $ - LEX_LBRACE
LEX_COLON2 db "::"
LEX_COLON2_len equ $ - LEX_COLON2
LEX_COLON db ":"
LEX_COLON_len equ $ - LEX_COLON
LEX_SEMI db ";"
LEX_SEMI_len equ $ - LEX_SEMI
LEX_COMMA db ","
LEX_COMMA_len equ $ - LEX_COMMA
LEX_PIPE2 db "||"
LEX_PIPE2_len equ $ - LEX_PIPE2
LEX_PIPE db "|"
LEX_PIPE_len equ $ - LEX_PIPE
LEX_AMP2 db "&&"
LEX_AMP2_len equ $ - LEX_AMP2
LEX_AMP db "&"
LEX_AMP_len equ $ - LEX_AMP
LEX_EQEQ db "=="
LEX_EQEQ_len equ $ - LEX_EQEQ
LEX_LBRACKET db "["
LEX_LBRACKET_len equ $ - LEX_LBRACKET
LEX_RBRACKET db "]"
@ -225,6 +285,36 @@ NUM_LEXEMES: dq 43
LEX_F32_len equ $ - LEX_F32
LEX_F64 db "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_len equ $ - LEX_IDENT
LEX_NUMBER db "<number>"
@ -250,36 +340,54 @@ NUM_LEXEMES: dq 43
TOKEN_ARROW equ 12 ; :u8
TOKEN_I32 equ 13 ; :u8
TOKEN_U32 equ 14 ; :u8
TOKEN_EQUALS equ 15 ; :u8
TOKEN_PLUS equ 16 ; :u8
TOKEN_MINUS equ 17 ; :u8
TOKEN_RPARENS equ 18 ; :u8
TOKEN_LPARENS equ 19 ; :u8
TOKEN_RBRACE equ 20 ; :u8
TOKEN_LBRACE equ 21 ; :u8
TOKEN_COLON equ 22 ; :u8
TOKEN_SEMI equ 23 ; :u8
TOKEN_COMMA equ 24 ; :u8
TOKEN_PIPE equ 25 ; :u8
TOKEN_AMP equ 26 ; :u8
TOKEN_EQEQ equ 27 ; :u8
TOKEN_LBRACKET equ 28 ; :u8
TOKEN_RBRACKET equ 29 ; :u8
TOKEN_VOID equ 30 ; :u8
TOKEN_SLASH equ 31 ; :u8
TOKEN_STAR equ 32 ; :u8
TOKEN_U8 equ 33 ; :u8
TOKEN_I8 equ 34 ; :u8
TOKEN_U16 equ 35 ; :u8
TOKEN_I16 equ 36 ; :u8
TOKEN_U64 equ 37 ; :u8
TOKEN_I64 equ 38 ; :u8
TOKEN_USIZE equ 39 ; :u8
TOKEN_ISIZE equ 40 ; :u8
TOKEN_F32 equ 41 ; :u8
TOKEN_F64 equ 42 ; :u8
TOKEN_IDENT equ 43 ; :u8
TOKEN_NUMBER equ 44 ; :u8
TOKEN_STRING equ 45 ; :u8
TOKEN_COMMENT equ 46 ; :u8
TOKEN_EQEQ equ 15 ; :u8
TOKEN_EQUALS equ 16 ; :u8
TOKEN_PLUS equ 17 ; :u8
TOKEN_MINUS equ 18 ; :u8
TOKEN_RPARENS equ 19 ; :u8
TOKEN_LPARENS equ 20 ; :u8
TOKEN_RBRACE equ 21 ; :u8
TOKEN_LBRACE equ 22 ; :u8
TOKEN_COLON equ 23 ; :u8
TOKEN_COLON2 equ 24 ; :u8
TOKEN_SEMI equ 25 ; :u8
TOKEN_COMMA equ 26 ; :u8
TOKEN_PIPE equ 27 ; :u8
TOKEN_PIPE2 equ 28 ; :u8
TOKEN_AMP equ 29 ; :u8
TOKEN_AMP2 equ 30 ; :u8
TOKEN_LBRACKET equ 31 ; :u8
TOKEN_RBRACKET equ 32 ; :u8
TOKEN_VOID equ 33 ; :u8
TOKEN_SLASH equ 34 ; :u8
TOKEN_STAR equ 35 ; :u8
TOKEN_U8 equ 36 ; :u8
TOKEN_I8 equ 37 ; :u8
TOKEN_U16 equ 38 ; :u8
TOKEN_I16 equ 39 ; :u8
TOKEN_U64 equ 40 ; :u8
TOKEN_I64 equ 41 ; :u8
TOKEN_USIZE equ 42 ; :u8
TOKEN_ISIZE equ 43 ; :u8
TOKEN_F32 equ 44 ; :u8
TOKEN_F64 equ 45 ; :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

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_free_operand(ctx: *mut FunctionCtx, operand: *const Operand) -> ();
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 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) -> ();
@ -78,38 +79,56 @@ pub const TOKEN_BOOL: u8 = 11;
pub const TOKEN_ARROW: u8 = 12;
pub const TOKEN_I32: u8 = 13;
pub const TOKEN_U32: u8 = 14;
pub const TOKEN_EQUALS: u8 = 15;
pub const TOKEN_PLUS: u8 = 16;
pub const TOKEN_MINUS: u8 = 17;
pub const TOKEN_RPARENS: u8 = 18;
pub const TOKEN_LPARENS: u8 = 19;
pub const TOKEN_RBRACE: u8 = 20;
pub const TOKEN_LBRACE: u8 = 21;
pub const TOKEN_COLON: u8 = 22;
pub const TOKEN_SEMI: u8 = 23;
pub const TOKEN_COMMA: u8 = 24;
pub const TOKEN_PIPE: u8 = 25;
pub const TOKEN_AMP: u8 = 26;
pub const TOKEN_EQEQ: u8 = 27;
pub const TOKEN_LBRACKET: u8 = 28;
pub const TOKEN_RBRACKET: u8 = 29;
pub const TOKEN_VOID: u8 = 30;
pub const TOKEN_SLASH: u8 = 31;
pub const TOKEN_STAR: u8 = 32;
pub const TOKEN_U8: u8 = 33;
pub const TOKEN_I8: u8 = 34;
pub const TOKEN_U16: u8 = 35;
pub const TOKEN_I16: u8 = 36;
pub const TOKEN_U64: u8 = 37;
pub const TOKEN_I64: u8 = 38;
pub const TOKEN_USIZE: u8 = 39;
pub const TOKEN_ISIZE: u8 = 40;
pub const TOKEN_F32: u8 = 41;
pub const TOKEN_F64: u8 = 42;
pub const TOKEN_IDENT: u8 = 43;
pub const TOKEN_NUMBER: u8 = 44;
pub const TOKEN_STRING: u8 = 45;
pub const TOKEN_COMMENT: u8 = 46;
pub const TOKEN_EQEQ: u8 = 15;
pub const TOKEN_EQUALS: u8 = 16;
pub const TOKEN_PLUS: u8 = 17;
pub const TOKEN_MINUS: u8 = 18;
pub const TOKEN_RPARENS: u8 = 19;
pub const TOKEN_LPARENS: u8 = 20;
pub const TOKEN_RBRACE: u8 = 21;
pub const TOKEN_LBRACE: u8 = 22;
pub const TOKEN_COLON: u8 = 23;
pub const TOKEN_COLON2: u8 = 24;
pub const TOKEN_SEMI: u8 = 25;
pub const TOKEN_COMMA: u8 = 26;
pub const TOKEN_PIPE: u8 = 27;
pub const TOKEN_PIPE2: u8 = 28;
pub const TOKEN_AMP: u8 = 29;
pub const TOKEN_AMP2: u8 = 30;
pub const TOKEN_LBRACKET: u8 = 31;
pub const TOKEN_RBRACKET: u8 = 32;
pub const TOKEN_VOID: u8 = 33;
pub const TOKEN_SLASH: u8 = 34;
pub const TOKEN_STAR: u8 = 35;
pub const TOKEN_U8: u8 = 36;
pub const TOKEN_I8: u8 = 37;
pub const TOKEN_U16: u8 = 38;
pub const TOKEN_I16: u8 = 39;
pub const TOKEN_U64: u8 = 40;
pub const TOKEN_I64: u8 = 41;
pub const TOKEN_USIZE: u8 = 42;
pub const TOKEN_ISIZE: u8 = 43;
pub const TOKEN_F32: u8 = 44;
pub const TOKEN_F64: u8 = 45;
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)]
#[derive(Debug)]

View file

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