const CONST: &str = "[\\. \\(,=^]([A-Z][A-Z0-9_]*)[\\. ,\\)=$]"; const TYPE: &str = "[\\. \\(,=^]([A-Z][a-zA-Z0-9_]*)[\\. ,\\)\\(=$]"; const IDENT: &str = "[\\. \\(,=^]([a-z][a-zA-Z0-9_]*)[\\. ,\\)=$]"; const FUNC: &str = "[\\. \\(,=^]([a-z][A-Z0-9_]*)\\("; pub fn grammar_for(syntax: &str) -> &'static [(&'static str, &'static [&'static str])] { match syntax { "rs" | "rust" => &[ ( "keyword", &[ "fn", "pub", "async", "return", "if", "else", "let", "for", "in", "while", "loop", "impl", "for", "trait", "struct", "enum", "dyn", ], ), ( "type", &[ TYPE, "bool", "usize", "u8", "u16", "u32", "u64", "u128", "i8", "i16", "i32", "i64", "i128", "isize", "f32", "f64", ], ), ("constant", &[CONST]), ("comment", &["(?m)(//.*)$", "(?ms)/\\*.*?\\*/"]), ("macro", &["[\\. ,=^]([a-z_][A-Za-z0-9_]*!)[\\. ,=$]"]), ("identifier", &[IDENT]), ("function", &[FUNC]), ( "literal", &["\".*?\"", "(0x|0o|0b)[0-9a-f]+", "\\d+", "true", "false"], ), ], "py" | "python" => &[ ("type", &["bytes", "bool", "int", "str", "float"]), ( "keyword", &[ "from", "for", "def", "if", "else", "elif", "while", "with", "in", "assert", "global", "nonlocal", "as", "import", ], ), ("comment", &["(?m)(#.*)$"]), ("constant", &[CONST]), ("identifier", &[IDENT]), ( "literal", &[ "b?f?\".*?\"", "b?f?'.*?'", "(0x|0o|0b)[0-9a-f]+", "\\d+", "true", "false", ], ), ], "tree" => &[("keyword", &["[├─└│]+"])], // makefile doesnt really match the token-kinds, i'll just use something that looks goo "makefile" | "mk" => &[ ("comment", &["(?m)(#.*)$"]), ("literal", &[".+: "]), ("macro", &["\\$\\(\\w+\\)"]), ("type", &["\\$@", "\\$<"]), ], _ => &[], } }