brink_syntax_native/lexer/
ident.rs1use crate::SyntaxKind;
2
3pub fn is_ident_start_byte(b: u8) -> bool {
13 b.is_ascii_alphabetic() || b == b'_'
14}
15
16pub fn is_ident_continue_byte(b: u8) -> bool {
19 b.is_ascii_alphanumeric() || b == b'_'
20}
21
22pub fn scan_ident(bytes: &[u8], mut pos: usize) -> usize {
25 while pos < bytes.len() && is_ident_continue_byte(bytes[pos]) {
26 pos += 1;
27 }
28 pos
29}
30
31pub fn classify_keyword(text: &str) -> SyntaxKind {
33 use SyntaxKind::{
34 IDENT, KW_AS, KW_BREAK, KW_CONST, KW_CONTINUE, KW_DONE, KW_ELSE, KW_END, KW_EXTERN,
35 KW_FALSE, KW_FLAGS, KW_FLOW, KW_FN, KW_FOR, KW_IF, KW_IMPORT, KW_IN, KW_LET, KW_MATCH,
36 KW_MODULE, KW_OR, KW_PUB, KW_REF, KW_RETURN, KW_STRUCT, KW_TRUE, KW_UNTIL, KW_USE, KW_VAR,
37 KW_WHILE,
38 };
39 match text {
40 "pub" => KW_PUB,
41 "flow" => KW_FLOW,
42 "fn" => KW_FN,
43 "var" => KW_VAR,
44 "const" => KW_CONST,
45 "let" => KW_LET,
46 "flags" => KW_FLAGS,
47 "struct" => KW_STRUCT,
48 "extern" => KW_EXTERN,
49 "import" => KW_IMPORT,
50 "use" => KW_USE,
51 "module" => KW_MODULE,
52 "return" => KW_RETURN,
53 "ref" => KW_REF,
54 "if" => KW_IF,
55 "match" => KW_MATCH,
56 "else" => KW_ELSE,
57 "while" => KW_WHILE,
58 "for" => KW_FOR,
59 "in" => KW_IN,
60 "until" => KW_UNTIL,
61 "break" => KW_BREAK,
62 "continue" => KW_CONTINUE,
63 "as" => KW_AS,
64 "or" => KW_OR,
65 "true" => KW_TRUE,
66 "false" => KW_FALSE,
67 "END" => KW_END,
68 "DONE" => KW_DONE,
69 _ => IDENT,
70 }
71}