moduforge_rules_expression/lexer/
token.rs

1use std::fmt::{Display, Formatter};
2use std::hash::{Hash, Hasher};
3use std::str::FromStr;
4
5use nohash_hasher::IsEnabled;
6use strum_macros::{Display, EnumIter, EnumString, FromRepr, IntoStaticStr};
7
8/// 令牌结构体
9/// 包含词法分析过程中识别出的令牌信息
10#[derive(Debug, PartialEq, Eq, Clone)]
11pub struct Token<'a> {
12    pub span: (u32, u32), // 令牌在源代码中的位置范围(开始位置,结束位置)
13    pub kind: TokenKind,  // 令牌的类型
14    pub value: &'a str,   // 令牌的原始字符串值
15}
16
17/// 令牌类型枚举
18/// 定义了表达式中可能出现的所有令牌类型
19#[derive(Debug, PartialEq, Eq, Clone, Copy, Display)]
20pub enum TokenKind {
21    Identifier(Identifier),       // 标识符(变量名、关键字等)
22    Boolean(bool),                // 布尔值(true/false)
23    Number,                       // 数字
24    QuotationMark(QuotationMark), // 引号(单引号、双引号、反引号)
25    Literal,                      // 字面量(字符串内容等)
26    Operator(Operator),           // 操作符
27    Bracket(Bracket),             // 括号
28    TemplateString(TemplateString), // 模板字符串相关标记
29}
30
31/// 特殊标识符枚举
32/// 定义了表达式中的特殊标识符
33#[derive(
34    Debug, PartialEq, Eq, Clone, Copy, Display, EnumString, IntoStaticStr,
35)]
36pub enum Identifier {
37    #[strum(serialize = "$")]
38    ContextReference, // 上下文引用 $
39    #[strum(serialize = "$root")]
40    RootReference, // 根引用 $root
41    #[strum(serialize = "#")]
42    CallbackReference, // 回调引用 #
43    #[strum(serialize = "null")]
44    Null, // 空值 null
45}
46
47/// 引号类型枚举
48/// 定义了不同类型的引号
49#[derive(
50    Debug, PartialEq, Eq, Clone, Copy, Display, EnumString, IntoStaticStr,
51)]
52pub enum QuotationMark {
53    #[strum(serialize = "'")]
54    SingleQuote, // 单引号 '
55    #[strum(serialize = "\"")]
56    DoubleQuote, // 双引号 "
57    #[strum(serialize = "`")]
58    Backtick, // 反引号 `(用于模板字符串)
59}
60
61/// 模板字符串标记枚举
62/// 用于标识模板字符串中的表达式开始和结束
63#[derive(Debug, PartialEq, Eq, Clone, Copy, EnumString, IntoStaticStr)]
64pub enum TemplateString {
65    #[strum(serialize = "${")]
66    ExpressionStart, // 表达式开始标记 ${
67    #[strum(serialize = "}")]
68    ExpressionEnd, // 表达式结束标记 }
69}
70
71impl Display for TemplateString {
72    fn fmt(
73        &self,
74        f: &mut Formatter<'_>,
75    ) -> std::fmt::Result {
76        match *self {
77            TemplateString::ExpressionStart => {
78                ::core::fmt::Display::fmt("${", f)
79            },
80            TemplateString::ExpressionEnd => ::core::fmt::Display::fmt("}}", f),
81        }
82    }
83}
84
85/// 操作符枚举
86/// 定义了表达式中的各种操作符
87#[derive(Debug, PartialEq, Eq, Clone, Copy)]
88pub enum Operator {
89    Arithmetic(ArithmeticOperator), // 算术操作符
90    Logical(LogicalOperator),       // 逻辑操作符
91    Comparison(ComparisonOperator), // 比较操作符
92    Range,                          // 范围操作符 ..
93    Comma,                          // 逗号 ,
94    Slice,                          // 切片操作符 :
95    Dot,                            // 点操作符 .
96    QuestionMark,                   // 问号 ?
97}
98
99impl Display for Operator {
100    fn fmt(
101        &self,
102        f: &mut Formatter<'_>,
103    ) -> std::fmt::Result {
104        match self {
105            Operator::Arithmetic(a) => write!(f, "{a}"),
106            Operator::Logical(l) => write!(f, "{l}"),
107            Operator::Comparison(c) => write!(f, "{c}"),
108            Operator::Range => write!(f, ".."),
109            Operator::Comma => write!(f, ","),
110            Operator::Slice => write!(f, ":"),
111            Operator::Dot => write!(f, "."),
112            Operator::QuestionMark => write!(f, "?"),
113        }
114    }
115}
116
117impl FromStr for Operator {
118    type Err = strum::ParseError;
119
120    /// 从字符串解析操作符
121    /// 按优先级尝试解析不同类型的操作符
122    fn from_str(operator: &str) -> Result<Self, Self::Err> {
123        match operator {
124            ".." => Ok(Operator::Range),
125            "," => Ok(Operator::Comma),
126            ":" => Ok(Operator::Slice),
127            "." => Ok(Operator::Dot),
128            "?" => Ok(Operator::QuestionMark),
129            _ => ArithmeticOperator::try_from(operator)
130                .map(Operator::Arithmetic)
131                .or_else(|_| {
132                    LogicalOperator::try_from(operator).map(Operator::Logical)
133                })
134                .or_else(|_| {
135                    ComparisonOperator::try_from(operator)
136                        .map(Operator::Comparison)
137                }),
138        }
139    }
140}
141
142/// 算术操作符枚举
143/// 定义了基本的算术运算操作符
144#[derive(Debug, PartialEq, Eq, Clone, Copy, Display, EnumString)]
145pub enum ArithmeticOperator {
146    #[strum(serialize = "+")]
147    Add, // 加法 +
148    #[strum(serialize = "-")]
149    Subtract, // 减法 -
150    #[strum(serialize = "*")]
151    Multiply, // 乘法 *
152    #[strum(serialize = "/")]
153    Divide, // 除法 /
154    #[strum(serialize = "%")]
155    Modulus, // 取模 %
156    #[strum(serialize = "^")]
157    Power, // 幂运算 ^
158}
159
160/// 逻辑操作符枚举
161/// 定义了逻辑运算操作符
162#[derive(Debug, PartialEq, Eq, Clone, Copy, Display, EnumString)]
163pub enum LogicalOperator {
164    #[strum(serialize = "and")]
165    And, // 逻辑与 and
166    #[strum(serialize = "or")]
167    Or, // 逻辑或 or
168    #[strum(serialize = "not", serialize = "!")]
169    Not, // 逻辑非 not 或 !
170    #[strum(serialize = "??")]
171    NullishCoalescing, // 空值合并操作符 ??
172}
173
174/// 比较操作符枚举
175/// 定义了比较运算操作符
176#[derive(Debug, PartialEq, Eq, Clone, Copy, Display, EnumString)]
177pub enum ComparisonOperator {
178    #[strum(serialize = "==")]
179    Equal, // 等于 ==
180    #[strum(serialize = "!=")]
181    NotEqual, // 不等于 !=
182    #[strum(serialize = "<")]
183    LessThan, // 小于 <
184    #[strum(serialize = ">")]
185    GreaterThan, // 大于 >
186    #[strum(serialize = "<=")]
187    LessThanOrEqual, // 小于等于 <=
188    #[strum(serialize = ">=")]
189    GreaterThanOrEqual, // 大于等于 >=
190    #[strum(serialize = "in")]
191    In, // 包含 in
192    #[strum(serialize = "not in")]
193    NotIn, // 不包含 not in
194}
195
196/// 括号枚举
197/// 定义了各种类型的括号
198#[derive(
199    Debug,
200    PartialEq,
201    Eq,
202    Clone,
203    Copy,
204    EnumString,
205    IntoStaticStr,
206    EnumIter,
207    FromRepr,
208)]
209pub enum Bracket {
210    #[strum(serialize = "(")]
211    LeftParenthesis, // 左圆括号 (
212    #[strum(serialize = ")")]
213    RightParenthesis, // 右圆括号 )
214    #[strum(serialize = "[")]
215    LeftSquareBracket, // 左方括号 [
216    #[strum(serialize = "]")]
217    RightSquareBracket, // 右方括号 ]
218    #[strum(serialize = "{")]
219    LeftCurlyBracket, // 左花括号 {
220    #[strum(serialize = "}")]
221    RightCurlyBracket, // 右花括号 }
222}
223
224impl Display for Bracket {
225    fn fmt(
226        &self,
227        f: &mut Formatter<'_>,
228    ) -> std::fmt::Result {
229        match *self {
230            Bracket::LeftParenthesis => ::core::fmt::Display::fmt("(", f),
231            Bracket::RightParenthesis => ::core::fmt::Display::fmt(")", f),
232            Bracket::LeftSquareBracket => ::core::fmt::Display::fmt("[", f),
233            Bracket::RightSquareBracket => ::core::fmt::Display::fmt("]", f),
234            Bracket::LeftCurlyBracket => ::core::fmt::Display::fmt("{", f),
235            Bracket::RightCurlyBracket => ::core::fmt::Display::fmt("}}", f),
236        }
237    }
238}
239
240impl Operator {
241    /// 获取操作符的变体编号
242    /// 用于哈希和比较操作,为每个操作符分配唯一的数字标识
243    pub fn variant(&self) -> u8 {
244        match &self {
245            Operator::Arithmetic(a) => match a {
246                ArithmeticOperator::Add => 1,
247                ArithmeticOperator::Subtract => 2,
248                ArithmeticOperator::Multiply => 3,
249                ArithmeticOperator::Divide => 4,
250                ArithmeticOperator::Modulus => 5,
251                ArithmeticOperator::Power => 6,
252            },
253            Operator::Logical(l) => match l {
254                LogicalOperator::And => 7,
255                LogicalOperator::Or => 8,
256                LogicalOperator::Not => 9,
257                LogicalOperator::NullishCoalescing => 10,
258            },
259            Operator::Comparison(c) => match c {
260                ComparisonOperator::Equal => 11,
261                ComparisonOperator::NotEqual => 12,
262                ComparisonOperator::LessThan => 13,
263                ComparisonOperator::GreaterThan => 14,
264                ComparisonOperator::LessThanOrEqual => 15,
265                ComparisonOperator::GreaterThanOrEqual => 16,
266                ComparisonOperator::In => 17,
267                ComparisonOperator::NotIn => 18,
268            },
269            Operator::Range => 19,
270            Operator::Comma => 20,
271            Operator::Slice => 21,
272            Operator::Dot => 22,
273            Operator::QuestionMark => 23,
274        }
275    }
276}
277
278impl Hash for Operator {
279    /// 为操作符实现哈希
280    /// 使用变体编号作为哈希值
281    fn hash<H: Hasher>(
282        &self,
283        state: &mut H,
284    ) {
285        state.write_u8(self.variant());
286    }
287}
288
289// 启用nohash_hasher优化
290impl IsEnabled for Operator {}