1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
use crate::*; #[derive(Debug)] pub struct Rule { pub span: diagn::Span, pub pattern: Vec<PatternPart>, pub parameters: Vec<PatternParameter>, pub production: expr::Expr, } #[derive(Debug)] pub enum PatternPart { Exact(char), Parameter(usize), } #[derive(Debug)] pub struct PatternParameter { pub name: String, pub typ: PatternParameterType } #[derive(Copy, Clone, Debug)] pub enum PatternParameterType { Unspecified, Ruleset(asm::RulesetRef), Unsigned(usize), Signed(usize), Integer(usize), } impl Rule { pub fn new() -> Rule { Rule { span: diagn::Span::new_dummy(), pattern: Vec::new(), parameters: Vec::new(), production: expr::Expr::new_dummy(), } } pub fn pattern_add_exact(&mut self, token: &syntax::Token) { for c in token.text().chars() { let part = PatternPart::Exact(c.to_ascii_lowercase()); self.pattern.push(part); } } pub fn pattern_add_parameter(&mut self, param: PatternParameter) { let param_index = self.parameters.len(); self.parameters.push(param); self.pattern.push(PatternPart::Parameter(param_index)); } }