use crate::rules::{Associativity, Alias, Rule, Symbol}; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub(crate) enum VariableType { Hidden, Auxiliary, Anonymous, Named } // Input grammar #[derive(Clone, Debug, PartialEq, Eq)] pub(crate) struct Variable { pub name: String, pub kind: VariableType, pub rule: Rule, } #[derive(Debug, PartialEq, Eq)] pub(crate) struct InputGrammar { pub name: String, pub variables: Vec, pub extra_tokens: Vec, pub expected_conflicts: Vec>, pub external_tokens: Vec, pub variables_to_inline: Vec, pub word_token: Option, } // Extracted lexical grammar #[derive(Debug, PartialEq, Eq)] pub(crate) struct LexicalGrammar { pub variables: Vec, pub separators: Vec, } // Extracted syntax grammar #[derive(Clone, Debug, PartialEq, Eq)] pub(crate) struct ProductionStep { pub symbol: Symbol, pub precedence: i32, pub associativity: Option, pub alias: Option, pub is_excluded: bool, } #[derive(Clone, Debug, PartialEq, Eq)] pub(crate) struct Production { pub steps: Vec, pub dynamic_precedence: i32, } #[derive(Clone, Debug, PartialEq, Eq)] pub(crate) struct SyntaxVariable { pub name: String, pub kind: VariableType, } #[derive(Clone, Debug, PartialEq, Eq)] pub(crate) struct ExternalToken { pub name: String, pub kind: VariableType, pub corresponding_internal_token: Option, } #[derive(Debug)] pub(crate) struct SyntaxGrammar { pub variables: Vec, pub extra_tokens: Vec, pub expected_conflicts: Vec>, pub external_tokens: Vec, pub variables_to_inline: Vec, pub word_token: Symbol, } impl Variable { pub fn named(name: &str, rule: Rule) -> Self { Self { name: name.to_string(), kind: VariableType::Named, rule } } pub fn auxiliary(name: &str, rule: Rule) -> Self { Self { name: name.to_string(), kind: VariableType::Auxiliary, rule } } pub fn hidden(name: &str, rule: Rule) -> Self { Self { name: name.to_string(), kind: VariableType::Hidden, rule } } pub fn anonymous(name: &str, rule: Rule) -> Self { Self { name: name.to_string(), kind: VariableType::Anonymous, rule } } }