yog_script_analyze/source/
token.rs1use crate::words::Word;
4
5pub use yog_data::Span;
7
8pub const QUOTE: char = '\'';
11
12#[derive(Debug, Clone, PartialEq)]
14pub enum StrPart {
15 Text(String),
16 Expr {
19 tokens: Vec<Token>,
20 alignment: Option<String>,
21 format: Option<String>,
22 },
23}
24
25#[derive(Debug, Clone, PartialEq)]
27pub enum Tok {
28 Ident(String),
29 Keyword(&'static Word),
31 Int(i64),
32 Float(f64),
33 Unit(String, String),
36 Version(String),
38 Str(Vec<StrPart>),
39 RawStr(String),
40 Char(char),
41 Lifetime(String),
43 Doc(String),
45 Punct(Punct),
46 Eof,
47}
48
49#[derive(Debug, Clone, PartialEq)]
51pub struct Token {
52 pub tok: Tok,
53 pub span: Span,
54}
55
56macro_rules! puncts {
57 ($(#[$doc:meta])* $name:ident { $($variant:ident = $text:literal,)* }) => {
58 $(#[$doc])*
59 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
60 pub enum $name { $($variant),* }
61
62 impl $name {
63 pub const ALL: &'static [$name] = &[$($name::$variant),*];
64
65 #[must_use]
67 pub const fn text(self) -> &'static str {
68 match self { $($name::$variant => $text),* }
69 }
70 }
71 };
72}
73
74puncts! {
75 Punct {
77 RangeExcl = "..<", NullAssign = "??=", ShlEq = "<<=",
78 FatArrow = "=>", SafeDot = "?.", Coalesce = "??",
79 EqEq = "==", NotEq = "!=", Shl = "<<", LtEq = "<=", GtEq = ">=", AndAnd = "&&", OrOr = "||",
80 PlusEq = "+=", MinusEq = "-=", StarEq = "*=", SlashEq = "/=", PercentEq = "%=",
81 AmpEq = "&=", PipeEq = "|=", CaretEq = "^=", PlusPlus = "++", MinusMinus = "--",
82 Range = "..",
83 LBrace = "{", RBrace = "}", LParen = "(", RParen = ")", LBracket = "[", RBracket = "]",
84 Comma = ",", Dot = ".", Colon = ":", Semi = ";", Question = "?",
85 Eq = "=", Lt = "<", Gt = ">", Plus = "+", Minus = "-", Star = "*", Slash = "/",
86 Percent = "%", Bang = "!", Amp = "&", Hash = "#", Dollar = "$",
87 Pipe = "|", Caret = "^", Tilde = "~",
88 }
89}