#![allow(clippy::enum_variant_names)]
#![allow(clippy::large_enum_variant)]
#![allow(clippy::upper_case_acronyms)]
use parol_runtime::derive_builder::Builder;
use parol_runtime::log::trace;
#[allow(unused_imports)]
use parol_runtime::parol_macros::{pop_and_reverse_item, pop_item};
use parol_runtime::parser::{ParseTreeType, UserActionsTrait};
use parol_runtime::{ParserError, Result, Token};
pub trait ParolGrammarTrait<'t> {
fn parol(&mut self, _arg: &Parol<'t>) -> Result<()> {
Ok(())
}
fn prolog(&mut self, _arg: &Prolog<'t>) -> Result<()> {
Ok(())
}
fn start_declaration(&mut self, _arg: &StartDeclaration<'t>) -> Result<()> {
Ok(())
}
fn declaration(&mut self, _arg: &Declaration<'t>) -> Result<()> {
Ok(())
}
fn scanner_directives(&mut self, _arg: &ScannerDirectives<'t>) -> Result<()> {
Ok(())
}
fn grammar_definition(&mut self, _arg: &GrammarDefinition<'t>) -> Result<()> {
Ok(())
}
fn double_colon(&mut self, _arg: &DoubleColon<'t>) -> Result<()> {
Ok(())
}
fn production(&mut self, _arg: &Production<'t>) -> Result<()> {
Ok(())
}
fn alternations(&mut self, _arg: &Alternations<'t>) -> Result<()> {
Ok(())
}
fn alternation(&mut self, _arg: &Alternation<'t>) -> Result<()> {
Ok(())
}
fn factor(&mut self, _arg: &Factor<'t>) -> Result<()> {
Ok(())
}
fn symbol(&mut self, _arg: &Symbol<'t>) -> Result<()> {
Ok(())
}
fn token_literal(&mut self, _arg: &TokenLiteral<'t>) -> Result<()> {
Ok(())
}
fn simple_token(&mut self, _arg: &SimpleToken<'t>) -> Result<()> {
Ok(())
}
fn token_with_states(&mut self, _arg: &TokenWithStates<'t>) -> Result<()> {
Ok(())
}
fn string(&mut self, _arg: &String<'t>) -> Result<()> {
Ok(())
}
fn raw_string(&mut self, _arg: &RawString<'t>) -> Result<()> {
Ok(())
}
fn regex(&mut self, _arg: &Regex<'t>) -> Result<()> {
Ok(())
}
fn group(&mut self, _arg: &Group<'t>) -> Result<()> {
Ok(())
}
fn optional(&mut self, _arg: &Optional<'t>) -> Result<()> {
Ok(())
}
fn repeat(&mut self, _arg: &Repeat<'t>) -> Result<()> {
Ok(())
}
fn non_terminal(&mut self, _arg: &NonTerminal<'t>) -> Result<()> {
Ok(())
}
fn identifier(&mut self, _arg: &Identifier<'t>) -> Result<()> {
Ok(())
}
fn scanner_state(&mut self, _arg: &ScannerState<'t>) -> Result<()> {
Ok(())
}
fn state_list(&mut self, _arg: &StateList<'t>) -> Result<()> {
Ok(())
}
fn scanner_switch(&mut self, _arg: &ScannerSwitch<'t>) -> Result<()> {
Ok(())
}
fn a_s_t_control(&mut self, _arg: &ASTControl) -> Result<()> {
Ok(())
}
fn cut_operator(&mut self, _arg: &CutOperator) -> Result<()> {
Ok(())
}
fn user_type_declaration(&mut self, _arg: &UserTypeDeclaration) -> Result<()> {
Ok(())
}
fn user_type_name(&mut self, _arg: &UserTypeName<'t>) -> Result<()> {
Ok(())
}
fn on_comment_parsed(&mut self, _token: Token<'t>) {}
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct DeclarationPercentTitleString<'t> {
pub string: Box<String<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct DeclarationPercentCommentString<'t> {
pub string: Box<String<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct DeclarationPercentUserUnderscoreTypeIdentifierEquUserTypeName<'t> {
pub identifier: Box<Identifier<'t>>,
pub user_type_name: crate::parser::parol_grammar::UserDefinedTypeName,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct DeclarationScannerDirectives<'t> {
pub scanner_directives: Box<ScannerDirectives<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct ScannerDirectivesPercentLineUnderscoreCommentTokenLiteral<'t> {
pub token_literal: Box<TokenLiteral<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct ScannerDirectivesPercentBlockUnderscoreCommentTokenLiteralTokenLiteral<'t> {
pub token_literal: Box<TokenLiteral<'t>>,
pub token_literal0: Box<TokenLiteral<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct ScannerDirectivesPercentAutoUnderscoreNewlineUnderscoreOff {}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct ScannerDirectivesPercentAutoUnderscoreWsUnderscoreOff {}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct FactorGroup<'t> {
pub group: Box<Group<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct FactorRepeat<'t> {
pub repeat: Box<Repeat<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct FactorOptional<'t> {
pub optional: Box<Optional<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct FactorSymbol<'t> {
pub symbol: Box<Symbol<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct SymbolNonTerminal<'t> {
pub non_terminal: Box<NonTerminal<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct SymbolSimpleToken<'t> {
pub simple_token: Box<SimpleToken<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct SymbolTokenWithStates<'t> {
pub token_with_states: Box<TokenWithStates<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct SymbolScannerSwitch<'t> {
pub scanner_switch: Box<ScannerSwitch<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct TokenLiteralString<'t> {
pub string: Box<String<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct TokenLiteralRawString<'t> {
pub raw_string: Box<RawString<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct TokenLiteralRegex<'t> {
pub regex: Box<Regex<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct ScannerSwitchPercentScLParenScannerSwitchOptRParen<'t> {
pub scanner_switch_opt: Option<Box<ScannerSwitchOpt<'t>>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct ScannerSwitchPercentPushLParenIdentifierRParen<'t> {
pub identifier: Box<Identifier<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct ScannerSwitchPercentPopLParenRParen {}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct ASTControlCutOperator {
pub cut_operator: Box<CutOperator>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct ASTControlUserTypeDeclaration {
pub user_type_declaration: Box<UserTypeDeclaration>,
}
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub enum ASTControl {
CutOperator(ASTControlCutOperator),
UserTypeDeclaration(ASTControlUserTypeDeclaration),
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct Alternation<'t> {
pub alternation_list: Vec<AlternationList<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct AlternationList<'t> {
pub factor: Box<Factor<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct Alternations<'t> {
pub alternation: Box<Alternation<'t>>,
pub alternations_list: Vec<AlternationsList<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct AlternationsList<'t> {
pub alternation: Box<Alternation<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct CutOperator {}
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub enum Declaration<'t> {
PercentTitleString(DeclarationPercentTitleString<'t>),
PercentCommentString(DeclarationPercentCommentString<'t>),
PercentUserUnderscoreTypeIdentifierEquUserTypeName(
DeclarationPercentUserUnderscoreTypeIdentifierEquUserTypeName<'t>,
),
ScannerDirectives(DeclarationScannerDirectives<'t>),
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct DoubleColon<'t> {
pub double_colon: Token<'t>, }
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub enum Factor<'t> {
Group(FactorGroup<'t>),
Repeat(FactorRepeat<'t>),
Optional(FactorOptional<'t>),
Symbol(FactorSymbol<'t>),
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct GrammarDefinition<'t> {
pub production: Box<Production<'t>>,
pub grammar_definition_list: Vec<GrammarDefinitionList<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct GrammarDefinitionList<'t> {
pub production: Box<Production<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct Group<'t> {
pub l_paren: Token<'t>, pub alternations: Box<Alternations<'t>>,
pub r_paren: Token<'t>, }
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct Identifier<'t> {
pub identifier: Token<'t>, }
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct NonTerminal<'t> {
pub identifier: Box<Identifier<'t>>,
pub non_terminal_opt: Option<Box<NonTerminalOpt>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct NonTerminalOpt {
pub a_s_t_control: Box<ASTControl>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct Optional<'t> {
pub l_bracket: Token<'t>, pub alternations: Box<Alternations<'t>>,
pub r_bracket: Token<'t>, }
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct Parol<'t> {
pub prolog: Box<Prolog<'t>>,
pub grammar_definition: Box<GrammarDefinition<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct Production<'t> {
pub identifier: Box<Identifier<'t>>,
pub alternations: Box<Alternations<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct Prolog<'t> {
pub start_declaration: Box<StartDeclaration<'t>>,
pub prolog_list: Vec<PrologList<'t>>,
pub prolog_list0: Vec<PrologList0>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct PrologList<'t> {
pub declaration: Box<Declaration<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct PrologList0 {
pub scanner_state: crate::parser::parol_grammar::ScannerConfig,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct RawString<'t> {
pub raw_string: Token<'t>, }
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct Regex<'t> {
pub regex: Token<'t>, }
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct Repeat<'t> {
pub l_brace: Token<'t>, pub alternations: Box<Alternations<'t>>,
pub r_brace: Token<'t>, }
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub enum ScannerDirectives<'t> {
PercentLineUnderscoreCommentTokenLiteral(
ScannerDirectivesPercentLineUnderscoreCommentTokenLiteral<'t>,
),
PercentBlockUnderscoreCommentTokenLiteralTokenLiteral(
ScannerDirectivesPercentBlockUnderscoreCommentTokenLiteralTokenLiteral<'t>,
),
PercentAutoUnderscoreNewlineUnderscoreOff(
ScannerDirectivesPercentAutoUnderscoreNewlineUnderscoreOff,
),
PercentAutoUnderscoreWsUnderscoreOff(ScannerDirectivesPercentAutoUnderscoreWsUnderscoreOff),
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct ScannerState<'t> {
pub identifier: Box<Identifier<'t>>,
pub scanner_state_list: Vec<ScannerStateList<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct ScannerStateList<'t> {
pub scanner_directives: Box<ScannerDirectives<'t>>,
}
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub enum ScannerSwitch<'t> {
PercentScLParenScannerSwitchOptRParen(ScannerSwitchPercentScLParenScannerSwitchOptRParen<'t>),
PercentPushLParenIdentifierRParen(ScannerSwitchPercentPushLParenIdentifierRParen<'t>),
PercentPopLParenRParen(ScannerSwitchPercentPopLParenRParen),
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct ScannerSwitchOpt<'t> {
pub identifier: Box<Identifier<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct SimpleToken<'t> {
pub token_literal: Box<TokenLiteral<'t>>,
pub simple_token_opt: Option<Box<SimpleTokenOpt>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct SimpleTokenOpt {
pub a_s_t_control: Box<ASTControl>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct StartDeclaration<'t> {
pub identifier: Box<Identifier<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct StateList<'t> {
pub identifier: Box<Identifier<'t>>,
pub state_list_list: Vec<StateListList<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct StateListList<'t> {
pub identifier: Box<Identifier<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct String<'t> {
pub string: Token<'t>, }
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub enum Symbol<'t> {
NonTerminal(SymbolNonTerminal<'t>),
SimpleToken(SymbolSimpleToken<'t>),
TokenWithStates(SymbolTokenWithStates<'t>),
ScannerSwitch(SymbolScannerSwitch<'t>),
}
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub enum TokenLiteral<'t> {
String(TokenLiteralString<'t>),
RawString(TokenLiteralRawString<'t>),
Regex(TokenLiteralRegex<'t>),
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct TokenWithStates<'t> {
pub state_list: Box<StateList<'t>>,
pub token_literal: Box<TokenLiteral<'t>>,
pub token_with_states_opt: Option<Box<TokenWithStatesOpt>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct TokenWithStatesOpt {
pub a_s_t_control: Box<ASTControl>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct UserTypeDeclaration {
pub user_type_name: crate::parser::parol_grammar::UserDefinedTypeName,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct UserTypeName<'t> {
pub identifier: Box<Identifier<'t>>,
pub user_type_name_list: Vec<UserTypeNameList<'t>>,
}
#[allow(dead_code)]
#[derive(Builder, Debug, Clone)]
#[builder(crate = "parol_runtime::derive_builder")]
pub struct UserTypeNameList<'t> {
pub identifier: Box<Identifier<'t>>,
}
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub enum ASTType<'t> {
ASTControl(ASTControl),
Alternation(Alternation<'t>),
AlternationList(Vec<AlternationList<'t>>),
Alternations(Alternations<'t>),
AlternationsList(Vec<AlternationsList<'t>>),
CutOperator(CutOperator),
Declaration(Declaration<'t>),
DoubleColon(DoubleColon<'t>),
Factor(Factor<'t>),
GrammarDefinition(GrammarDefinition<'t>),
GrammarDefinitionList(Vec<GrammarDefinitionList<'t>>),
Group(Group<'t>),
Identifier(Identifier<'t>),
NonTerminal(NonTerminal<'t>),
NonTerminalOpt(Option<Box<NonTerminalOpt>>),
Optional(Optional<'t>),
Parol(Parol<'t>),
Production(Production<'t>),
Prolog(Prolog<'t>),
PrologList(Vec<PrologList<'t>>),
PrologList0(Vec<PrologList0>),
RawString(RawString<'t>),
Regex(Regex<'t>),
Repeat(Repeat<'t>),
ScannerDirectives(ScannerDirectives<'t>),
ScannerState(ScannerState<'t>),
ScannerStateList(Vec<ScannerStateList<'t>>),
ScannerSwitch(ScannerSwitch<'t>),
ScannerSwitchOpt(Option<Box<ScannerSwitchOpt<'t>>>),
SimpleToken(SimpleToken<'t>),
SimpleTokenOpt(Option<Box<SimpleTokenOpt>>),
StartDeclaration(StartDeclaration<'t>),
StateList(StateList<'t>),
StateListList(Vec<StateListList<'t>>),
String(String<'t>),
Symbol(Symbol<'t>),
TokenLiteral(TokenLiteral<'t>),
TokenWithStates(TokenWithStates<'t>),
TokenWithStatesOpt(Option<Box<TokenWithStatesOpt>>),
UserTypeDeclaration(UserTypeDeclaration),
UserTypeName(UserTypeName<'t>),
UserTypeNameList(Vec<UserTypeNameList<'t>>),
}
#[allow(dead_code)]
pub struct ParolGrammarAuto<'t, 'u>
where
't: 'u,
{
user_grammar: &'u mut dyn ParolGrammarTrait<'t>,
item_stack: Vec<ASTType<'t>>,
}
impl<'t, 'u> ParolGrammarAuto<'t, 'u> {
pub fn new(user_grammar: &'u mut dyn ParolGrammarTrait<'t>) -> Self {
Self {
user_grammar,
item_stack: Vec::new(),
}
}
#[allow(dead_code)]
fn push(&mut self, item: ASTType<'t>, context: &str) {
trace!("push {}: {:?}", context, item);
self.item_stack.push(item)
}
#[allow(dead_code)]
fn pop(&mut self, context: &str) -> Option<ASTType<'t>> {
let item = self.item_stack.pop();
if let Some(ref item) = item {
trace!("pop {}: {:?}", context, item);
}
item
}
#[allow(dead_code)]
fn trace_item_stack(&self, context: &str) -> std::string::String {
format!(
"Item stack at {}:\n{}",
context,
self.item_stack
.iter()
.rev()
.map(|s| format!(" {:?}", s))
.collect::<Vec<std::string::String>>()
.join("\n")
)
}
#[parol_runtime::function_name::named]
fn parol(
&mut self,
_prolog: &ParseTreeType<'t>,
_grammar_definition: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let grammar_definition = pop_item!(self, grammar_definition, GrammarDefinition, context);
let prolog = pop_item!(self, prolog, Prolog, context);
let parol_built = Parol {
prolog: Box::new(prolog),
grammar_definition: Box::new(grammar_definition),
};
self.user_grammar.parol(&parol_built)?;
self.push(ASTType::Parol(parol_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn prolog(
&mut self,
_start_declaration: &ParseTreeType<'t>,
_prolog_list: &ParseTreeType<'t>,
_prolog_list0: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let prolog_list0 = pop_and_reverse_item!(self, prolog_list0, PrologList0, context);
let prolog_list = pop_and_reverse_item!(self, prolog_list, PrologList, context);
let start_declaration = pop_item!(self, start_declaration, StartDeclaration, context);
let prolog_built = Prolog {
start_declaration: Box::new(start_declaration),
prolog_list,
prolog_list0,
};
self.user_grammar.prolog(&prolog_built)?;
self.push(ASTType::Prolog(prolog_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn prolog_list0_0(
&mut self,
_scanner_state: &ParseTreeType<'t>,
_prolog_list0: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let mut prolog_list0 = pop_item!(self, prolog_list0, PrologList0, context);
let scanner_state = pop_item!(self, scanner_state, ScannerState, context);
let prolog_list0_0_built = PrologList0 {
scanner_state: (&scanner_state)
.try_into()
.map_err(parol_runtime::ParolError::UserError)?,
};
prolog_list0.push(prolog_list0_0_built);
self.push(ASTType::PrologList0(prolog_list0), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn prolog_list0_1(&mut self) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let prolog_list0_1_built = Vec::new();
self.push(ASTType::PrologList0(prolog_list0_1_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn prolog_list_0(
&mut self,
_declaration: &ParseTreeType<'t>,
_prolog_list: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let mut prolog_list = pop_item!(self, prolog_list, PrologList, context);
let declaration = pop_item!(self, declaration, Declaration, context);
let prolog_list_0_built = PrologList {
declaration: Box::new(declaration),
};
prolog_list.push(prolog_list_0_built);
self.push(ASTType::PrologList(prolog_list), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn prolog_list_1(&mut self) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let prolog_list_1_built = Vec::new();
self.push(ASTType::PrologList(prolog_list_1_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn start_declaration(
&mut self,
_percent_start: &ParseTreeType<'t>,
_identifier: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let identifier = pop_item!(self, identifier, Identifier, context);
let start_declaration_built = StartDeclaration {
identifier: Box::new(identifier),
};
self.user_grammar
.start_declaration(&start_declaration_built)?;
self.push(ASTType::StartDeclaration(start_declaration_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn declaration_0(
&mut self,
_percent_title: &ParseTreeType<'t>,
_string: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let string = pop_item!(self, string, String, context);
let declaration_0_built = DeclarationPercentTitleString {
string: Box::new(string),
};
let declaration_0_built = Declaration::PercentTitleString(declaration_0_built);
self.user_grammar.declaration(&declaration_0_built)?;
self.push(ASTType::Declaration(declaration_0_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn declaration_1(
&mut self,
_percent_comment: &ParseTreeType<'t>,
_string: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let string = pop_item!(self, string, String, context);
let declaration_1_built = DeclarationPercentCommentString {
string: Box::new(string),
};
let declaration_1_built = Declaration::PercentCommentString(declaration_1_built);
self.user_grammar.declaration(&declaration_1_built)?;
self.push(ASTType::Declaration(declaration_1_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn declaration_2(
&mut self,
_percent_user_underscore_type: &ParseTreeType<'t>,
_identifier: &ParseTreeType<'t>,
_equ: &ParseTreeType<'t>,
_user_type_name: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let user_type_name = pop_item!(self, user_type_name, UserTypeName, context);
let identifier = pop_item!(self, identifier, Identifier, context);
let declaration_2_built = DeclarationPercentUserUnderscoreTypeIdentifierEquUserTypeName {
identifier: Box::new(identifier),
user_type_name: (&user_type_name)
.try_into()
.map_err(parol_runtime::ParolError::UserError)?,
};
let declaration_2_built =
Declaration::PercentUserUnderscoreTypeIdentifierEquUserTypeName(declaration_2_built);
self.user_grammar.declaration(&declaration_2_built)?;
self.push(ASTType::Declaration(declaration_2_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn declaration_3(&mut self, _scanner_directives: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let scanner_directives = pop_item!(self, scanner_directives, ScannerDirectives, context);
let declaration_3_built = DeclarationScannerDirectives {
scanner_directives: Box::new(scanner_directives),
};
let declaration_3_built = Declaration::ScannerDirectives(declaration_3_built);
self.user_grammar.declaration(&declaration_3_built)?;
self.push(ASTType::Declaration(declaration_3_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn scanner_directives_0(
&mut self,
_percent_line_underscore_comment: &ParseTreeType<'t>,
_token_literal: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let token_literal = pop_item!(self, token_literal, TokenLiteral, context);
let scanner_directives_0_built =
ScannerDirectivesPercentLineUnderscoreCommentTokenLiteral {
token_literal: Box::new(token_literal),
};
let scanner_directives_0_built =
ScannerDirectives::PercentLineUnderscoreCommentTokenLiteral(scanner_directives_0_built);
self.user_grammar
.scanner_directives(&scanner_directives_0_built)?;
self.push(
ASTType::ScannerDirectives(scanner_directives_0_built),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn scanner_directives_1(
&mut self,
_percent_block_underscore_comment: &ParseTreeType<'t>,
_token_literal: &ParseTreeType<'t>,
_token_literal0: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let token_literal0 = pop_item!(self, token_literal0, TokenLiteral, context);
let token_literal = pop_item!(self, token_literal, TokenLiteral, context);
let scanner_directives_1_built =
ScannerDirectivesPercentBlockUnderscoreCommentTokenLiteralTokenLiteral {
token_literal: Box::new(token_literal),
token_literal0: Box::new(token_literal0),
};
let scanner_directives_1_built =
ScannerDirectives::PercentBlockUnderscoreCommentTokenLiteralTokenLiteral(
scanner_directives_1_built,
);
self.user_grammar
.scanner_directives(&scanner_directives_1_built)?;
self.push(
ASTType::ScannerDirectives(scanner_directives_1_built),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn scanner_directives_2(
&mut self,
_percent_auto_underscore_newline_underscore_off: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let scanner_directives_2_built =
ScannerDirectivesPercentAutoUnderscoreNewlineUnderscoreOff {
};
let scanner_directives_2_built =
ScannerDirectives::PercentAutoUnderscoreNewlineUnderscoreOff(
scanner_directives_2_built,
);
self.user_grammar
.scanner_directives(&scanner_directives_2_built)?;
self.push(
ASTType::ScannerDirectives(scanner_directives_2_built),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn scanner_directives_3(
&mut self,
_percent_auto_underscore_ws_underscore_off: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let scanner_directives_3_built = ScannerDirectivesPercentAutoUnderscoreWsUnderscoreOff {
};
let scanner_directives_3_built =
ScannerDirectives::PercentAutoUnderscoreWsUnderscoreOff(scanner_directives_3_built);
self.user_grammar
.scanner_directives(&scanner_directives_3_built)?;
self.push(
ASTType::ScannerDirectives(scanner_directives_3_built),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn grammar_definition(
&mut self,
_percent_percent: &ParseTreeType<'t>,
_production: &ParseTreeType<'t>,
_grammar_definition_list: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let grammar_definition_list = pop_and_reverse_item!(
self,
grammar_definition_list,
GrammarDefinitionList,
context
);
let production = pop_item!(self, production, Production, context);
let grammar_definition_built = GrammarDefinition {
production: Box::new(production),
grammar_definition_list,
};
self.user_grammar
.grammar_definition(&grammar_definition_built)?;
self.push(
ASTType::GrammarDefinition(grammar_definition_built),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn grammar_definition_list_0(
&mut self,
_production: &ParseTreeType<'t>,
_grammar_definition_list: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let mut grammar_definition_list = pop_item!(
self,
grammar_definition_list,
GrammarDefinitionList,
context
);
let production = pop_item!(self, production, Production, context);
let grammar_definition_list_0_built = GrammarDefinitionList {
production: Box::new(production),
};
grammar_definition_list.push(grammar_definition_list_0_built);
self.push(
ASTType::GrammarDefinitionList(grammar_definition_list),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn grammar_definition_list_1(&mut self) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let grammar_definition_list_1_built = Vec::new();
self.push(
ASTType::GrammarDefinitionList(grammar_definition_list_1_built),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn double_colon(&mut self, double_colon: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let double_colon = double_colon.token()?.clone();
let double_colon_built = DoubleColon { double_colon };
self.user_grammar.double_colon(&double_colon_built)?;
self.push(ASTType::DoubleColon(double_colon_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn production(
&mut self,
_identifier: &ParseTreeType<'t>,
_colon: &ParseTreeType<'t>,
_alternations: &ParseTreeType<'t>,
_semicolon: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let alternations = pop_item!(self, alternations, Alternations, context);
let identifier = pop_item!(self, identifier, Identifier, context);
let production_built = Production {
identifier: Box::new(identifier),
alternations: Box::new(alternations),
};
self.user_grammar.production(&production_built)?;
self.push(ASTType::Production(production_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn alternations(
&mut self,
_alternation: &ParseTreeType<'t>,
_alternations_list: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let alternations_list =
pop_and_reverse_item!(self, alternations_list, AlternationsList, context);
let alternation = pop_item!(self, alternation, Alternation, context);
let alternations_built = Alternations {
alternation: Box::new(alternation),
alternations_list,
};
self.user_grammar.alternations(&alternations_built)?;
self.push(ASTType::Alternations(alternations_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn alternations_list_0(
&mut self,
_or: &ParseTreeType<'t>,
_alternation: &ParseTreeType<'t>,
_alternations_list: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let mut alternations_list = pop_item!(self, alternations_list, AlternationsList, context);
let alternation = pop_item!(self, alternation, Alternation, context);
let alternations_list_0_built = AlternationsList {
alternation: Box::new(alternation),
};
alternations_list.push(alternations_list_0_built);
self.push(ASTType::AlternationsList(alternations_list), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn alternations_list_1(&mut self) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let alternations_list_1_built = Vec::new();
self.push(
ASTType::AlternationsList(alternations_list_1_built),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn alternation(&mut self, _alternation_list: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let alternation_list =
pop_and_reverse_item!(self, alternation_list, AlternationList, context);
let alternation_built = Alternation { alternation_list };
self.user_grammar.alternation(&alternation_built)?;
self.push(ASTType::Alternation(alternation_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn alternation_list_0(
&mut self,
_factor: &ParseTreeType<'t>,
_alternation_list: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let mut alternation_list = pop_item!(self, alternation_list, AlternationList, context);
let factor = pop_item!(self, factor, Factor, context);
let alternation_list_0_built = AlternationList {
factor: Box::new(factor),
};
alternation_list.push(alternation_list_0_built);
self.push(ASTType::AlternationList(alternation_list), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn alternation_list_1(&mut self) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let alternation_list_1_built = Vec::new();
self.push(ASTType::AlternationList(alternation_list_1_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn factor_0(&mut self, _group: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let group = pop_item!(self, group, Group, context);
let factor_0_built = FactorGroup {
group: Box::new(group),
};
let factor_0_built = Factor::Group(factor_0_built);
self.user_grammar.factor(&factor_0_built)?;
self.push(ASTType::Factor(factor_0_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn factor_1(&mut self, _repeat: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let repeat = pop_item!(self, repeat, Repeat, context);
let factor_1_built = FactorRepeat {
repeat: Box::new(repeat),
};
let factor_1_built = Factor::Repeat(factor_1_built);
self.user_grammar.factor(&factor_1_built)?;
self.push(ASTType::Factor(factor_1_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn factor_2(&mut self, _optional: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let optional = pop_item!(self, optional, Optional, context);
let factor_2_built = FactorOptional {
optional: Box::new(optional),
};
let factor_2_built = Factor::Optional(factor_2_built);
self.user_grammar.factor(&factor_2_built)?;
self.push(ASTType::Factor(factor_2_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn factor_3(&mut self, _symbol: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let symbol = pop_item!(self, symbol, Symbol, context);
let factor_3_built = FactorSymbol {
symbol: Box::new(symbol),
};
let factor_3_built = Factor::Symbol(factor_3_built);
self.user_grammar.factor(&factor_3_built)?;
self.push(ASTType::Factor(factor_3_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn symbol_0(&mut self, _non_terminal: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let non_terminal = pop_item!(self, non_terminal, NonTerminal, context);
let symbol_0_built = SymbolNonTerminal {
non_terminal: Box::new(non_terminal),
};
let symbol_0_built = Symbol::NonTerminal(symbol_0_built);
self.user_grammar.symbol(&symbol_0_built)?;
self.push(ASTType::Symbol(symbol_0_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn symbol_1(&mut self, _simple_token: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let simple_token = pop_item!(self, simple_token, SimpleToken, context);
let symbol_1_built = SymbolSimpleToken {
simple_token: Box::new(simple_token),
};
let symbol_1_built = Symbol::SimpleToken(symbol_1_built);
self.user_grammar.symbol(&symbol_1_built)?;
self.push(ASTType::Symbol(symbol_1_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn symbol_2(&mut self, _token_with_states: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let token_with_states = pop_item!(self, token_with_states, TokenWithStates, context);
let symbol_2_built = SymbolTokenWithStates {
token_with_states: Box::new(token_with_states),
};
let symbol_2_built = Symbol::TokenWithStates(symbol_2_built);
self.user_grammar.symbol(&symbol_2_built)?;
self.push(ASTType::Symbol(symbol_2_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn symbol_3(&mut self, _scanner_switch: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let scanner_switch = pop_item!(self, scanner_switch, ScannerSwitch, context);
let symbol_3_built = SymbolScannerSwitch {
scanner_switch: Box::new(scanner_switch),
};
let symbol_3_built = Symbol::ScannerSwitch(symbol_3_built);
self.user_grammar.symbol(&symbol_3_built)?;
self.push(ASTType::Symbol(symbol_3_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn token_literal_0(&mut self, _string: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let string = pop_item!(self, string, String, context);
let token_literal_0_built = TokenLiteralString {
string: Box::new(string),
};
let token_literal_0_built = TokenLiteral::String(token_literal_0_built);
self.user_grammar.token_literal(&token_literal_0_built)?;
self.push(ASTType::TokenLiteral(token_literal_0_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn token_literal_1(&mut self, _raw_string: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let raw_string = pop_item!(self, raw_string, RawString, context);
let token_literal_1_built = TokenLiteralRawString {
raw_string: Box::new(raw_string),
};
let token_literal_1_built = TokenLiteral::RawString(token_literal_1_built);
self.user_grammar.token_literal(&token_literal_1_built)?;
self.push(ASTType::TokenLiteral(token_literal_1_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn token_literal_2(&mut self, _regex: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let regex = pop_item!(self, regex, Regex, context);
let token_literal_2_built = TokenLiteralRegex {
regex: Box::new(regex),
};
let token_literal_2_built = TokenLiteral::Regex(token_literal_2_built);
self.user_grammar.token_literal(&token_literal_2_built)?;
self.push(ASTType::TokenLiteral(token_literal_2_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn simple_token(
&mut self,
_token_literal: &ParseTreeType<'t>,
_simple_token_opt: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let simple_token_opt = pop_item!(self, simple_token_opt, SimpleTokenOpt, context);
let token_literal = pop_item!(self, token_literal, TokenLiteral, context);
let simple_token_built = SimpleToken {
token_literal: Box::new(token_literal),
simple_token_opt,
};
self.user_grammar.simple_token(&simple_token_built)?;
self.push(ASTType::SimpleToken(simple_token_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn simple_token_opt_0(&mut self, _a_s_t_control: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let a_s_t_control = pop_item!(self, a_s_t_control, ASTControl, context);
let simple_token_opt_0_built = SimpleTokenOpt {
a_s_t_control: Box::new(a_s_t_control),
};
self.push(
ASTType::SimpleTokenOpt(Some(Box::new(simple_token_opt_0_built))),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn simple_token_opt_1(&mut self) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
self.push(ASTType::SimpleTokenOpt(None), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn token_with_states(
&mut self,
_l_t: &ParseTreeType<'t>,
_state_list: &ParseTreeType<'t>,
_g_t: &ParseTreeType<'t>,
_token_literal: &ParseTreeType<'t>,
_token_with_states_opt: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let token_with_states_opt =
pop_item!(self, token_with_states_opt, TokenWithStatesOpt, context);
let token_literal = pop_item!(self, token_literal, TokenLiteral, context);
let state_list = pop_item!(self, state_list, StateList, context);
let token_with_states_built = TokenWithStates {
state_list: Box::new(state_list),
token_literal: Box::new(token_literal),
token_with_states_opt,
};
self.user_grammar
.token_with_states(&token_with_states_built)?;
self.push(ASTType::TokenWithStates(token_with_states_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn token_with_states_opt_0(&mut self, _a_s_t_control: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let a_s_t_control = pop_item!(self, a_s_t_control, ASTControl, context);
let token_with_states_opt_0_built = TokenWithStatesOpt {
a_s_t_control: Box::new(a_s_t_control),
};
self.push(
ASTType::TokenWithStatesOpt(Some(Box::new(token_with_states_opt_0_built))),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn token_with_states_opt_1(&mut self) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
self.push(ASTType::TokenWithStatesOpt(None), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn string(&mut self, string: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let string = string.token()?.clone();
let string_built = String { string };
self.user_grammar.string(&string_built)?;
self.push(ASTType::String(string_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn raw_string(&mut self, raw_string: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let raw_string = raw_string.token()?.clone();
let raw_string_built = RawString { raw_string };
self.user_grammar.raw_string(&raw_string_built)?;
self.push(ASTType::RawString(raw_string_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn regex(&mut self, regex: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let regex = regex.token()?.clone();
let regex_built = Regex { regex };
self.user_grammar.regex(®ex_built)?;
self.push(ASTType::Regex(regex_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn group(
&mut self,
l_paren: &ParseTreeType<'t>,
_alternations: &ParseTreeType<'t>,
r_paren: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let l_paren = l_paren.token()?.clone();
let r_paren = r_paren.token()?.clone();
let alternations = pop_item!(self, alternations, Alternations, context);
let group_built = Group {
l_paren,
alternations: Box::new(alternations),
r_paren,
};
self.user_grammar.group(&group_built)?;
self.push(ASTType::Group(group_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn optional(
&mut self,
l_bracket: &ParseTreeType<'t>,
_alternations: &ParseTreeType<'t>,
r_bracket: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let l_bracket = l_bracket.token()?.clone();
let r_bracket = r_bracket.token()?.clone();
let alternations = pop_item!(self, alternations, Alternations, context);
let optional_built = Optional {
l_bracket,
alternations: Box::new(alternations),
r_bracket,
};
self.user_grammar.optional(&optional_built)?;
self.push(ASTType::Optional(optional_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn repeat(
&mut self,
l_brace: &ParseTreeType<'t>,
_alternations: &ParseTreeType<'t>,
r_brace: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let l_brace = l_brace.token()?.clone();
let r_brace = r_brace.token()?.clone();
let alternations = pop_item!(self, alternations, Alternations, context);
let repeat_built = Repeat {
l_brace,
alternations: Box::new(alternations),
r_brace,
};
self.user_grammar.repeat(&repeat_built)?;
self.push(ASTType::Repeat(repeat_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn non_terminal(
&mut self,
_identifier: &ParseTreeType<'t>,
_non_terminal_opt: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let non_terminal_opt = pop_item!(self, non_terminal_opt, NonTerminalOpt, context);
let identifier = pop_item!(self, identifier, Identifier, context);
let non_terminal_built = NonTerminal {
identifier: Box::new(identifier),
non_terminal_opt,
};
self.user_grammar.non_terminal(&non_terminal_built)?;
self.push(ASTType::NonTerminal(non_terminal_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn non_terminal_opt_0(&mut self, _a_s_t_control: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let a_s_t_control = pop_item!(self, a_s_t_control, ASTControl, context);
let non_terminal_opt_0_built = NonTerminalOpt {
a_s_t_control: Box::new(a_s_t_control),
};
self.push(
ASTType::NonTerminalOpt(Some(Box::new(non_terminal_opt_0_built))),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn non_terminal_opt_1(&mut self) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
self.push(ASTType::NonTerminalOpt(None), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn identifier(&mut self, identifier: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let identifier = identifier.token()?.clone();
let identifier_built = Identifier { identifier };
self.user_grammar.identifier(&identifier_built)?;
self.push(ASTType::Identifier(identifier_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn scanner_state(
&mut self,
_percent_scanner: &ParseTreeType<'t>,
_identifier: &ParseTreeType<'t>,
_l_brace: &ParseTreeType<'t>,
_scanner_state_list: &ParseTreeType<'t>,
_r_brace: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let scanner_state_list =
pop_and_reverse_item!(self, scanner_state_list, ScannerStateList, context);
let identifier = pop_item!(self, identifier, Identifier, context);
let scanner_state_built = ScannerState {
identifier: Box::new(identifier),
scanner_state_list,
};
self.user_grammar.scanner_state(&scanner_state_built)?;
self.push(ASTType::ScannerState(scanner_state_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn scanner_state_list_0(
&mut self,
_scanner_directives: &ParseTreeType<'t>,
_scanner_state_list: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let mut scanner_state_list = pop_item!(self, scanner_state_list, ScannerStateList, context);
let scanner_directives = pop_item!(self, scanner_directives, ScannerDirectives, context);
let scanner_state_list_0_built = ScannerStateList {
scanner_directives: Box::new(scanner_directives),
};
scanner_state_list.push(scanner_state_list_0_built);
self.push(ASTType::ScannerStateList(scanner_state_list), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn scanner_state_list_1(&mut self) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let scanner_state_list_1_built = Vec::new();
self.push(
ASTType::ScannerStateList(scanner_state_list_1_built),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn state_list(
&mut self,
_identifier: &ParseTreeType<'t>,
_state_list_list: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let state_list_list = pop_and_reverse_item!(self, state_list_list, StateListList, context);
let identifier = pop_item!(self, identifier, Identifier, context);
let state_list_built = StateList {
identifier: Box::new(identifier),
state_list_list,
};
self.user_grammar.state_list(&state_list_built)?;
self.push(ASTType::StateList(state_list_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn state_list_list_0(
&mut self,
_comma: &ParseTreeType<'t>,
_identifier: &ParseTreeType<'t>,
_state_list_list: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let mut state_list_list = pop_item!(self, state_list_list, StateListList, context);
let identifier = pop_item!(self, identifier, Identifier, context);
let state_list_list_0_built = StateListList {
identifier: Box::new(identifier),
};
state_list_list.push(state_list_list_0_built);
self.push(ASTType::StateListList(state_list_list), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn state_list_list_1(&mut self) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let state_list_list_1_built = Vec::new();
self.push(ASTType::StateListList(state_list_list_1_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn scanner_switch_0(
&mut self,
_percent_sc: &ParseTreeType<'t>,
_l_paren: &ParseTreeType<'t>,
_scanner_switch_opt: &ParseTreeType<'t>,
_r_paren: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let scanner_switch_opt = pop_item!(self, scanner_switch_opt, ScannerSwitchOpt, context);
let scanner_switch_0_built = ScannerSwitchPercentScLParenScannerSwitchOptRParen {
scanner_switch_opt,
};
let scanner_switch_0_built =
ScannerSwitch::PercentScLParenScannerSwitchOptRParen(scanner_switch_0_built);
self.user_grammar.scanner_switch(&scanner_switch_0_built)?;
self.push(ASTType::ScannerSwitch(scanner_switch_0_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn scanner_switch_1(
&mut self,
_percent_push: &ParseTreeType<'t>,
_l_paren: &ParseTreeType<'t>,
_identifier: &ParseTreeType<'t>,
_r_paren: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let identifier = pop_item!(self, identifier, Identifier, context);
let scanner_switch_1_built = ScannerSwitchPercentPushLParenIdentifierRParen {
identifier: Box::new(identifier),
};
let scanner_switch_1_built =
ScannerSwitch::PercentPushLParenIdentifierRParen(scanner_switch_1_built);
self.user_grammar.scanner_switch(&scanner_switch_1_built)?;
self.push(ASTType::ScannerSwitch(scanner_switch_1_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn scanner_switch_2(
&mut self,
_percent_pop: &ParseTreeType<'t>,
_l_paren: &ParseTreeType<'t>,
_r_paren: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let scanner_switch_2_built = ScannerSwitchPercentPopLParenRParen {
};
let scanner_switch_2_built = ScannerSwitch::PercentPopLParenRParen(scanner_switch_2_built);
self.user_grammar.scanner_switch(&scanner_switch_2_built)?;
self.push(ASTType::ScannerSwitch(scanner_switch_2_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn scanner_switch_opt_0(&mut self, _identifier: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let identifier = pop_item!(self, identifier, Identifier, context);
let scanner_switch_opt_0_built = ScannerSwitchOpt {
identifier: Box::new(identifier),
};
self.push(
ASTType::ScannerSwitchOpt(Some(Box::new(scanner_switch_opt_0_built))),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn scanner_switch_opt_1(&mut self) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
self.push(ASTType::ScannerSwitchOpt(None), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn a_s_t_control_0(&mut self, _cut_operator: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let cut_operator = pop_item!(self, cut_operator, CutOperator, context);
let a_s_t_control_0_built = ASTControlCutOperator {
cut_operator: Box::new(cut_operator),
};
let a_s_t_control_0_built = ASTControl::CutOperator(a_s_t_control_0_built);
self.user_grammar.a_s_t_control(&a_s_t_control_0_built)?;
self.push(ASTType::ASTControl(a_s_t_control_0_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn a_s_t_control_1(&mut self, _user_type_declaration: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let user_type_declaration =
pop_item!(self, user_type_declaration, UserTypeDeclaration, context);
let a_s_t_control_1_built = ASTControlUserTypeDeclaration {
user_type_declaration: Box::new(user_type_declaration),
};
let a_s_t_control_1_built = ASTControl::UserTypeDeclaration(a_s_t_control_1_built);
self.user_grammar.a_s_t_control(&a_s_t_control_1_built)?;
self.push(ASTType::ASTControl(a_s_t_control_1_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn cut_operator(&mut self, _cut_operator: &ParseTreeType<'t>) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let cut_operator_built = CutOperator {
};
self.user_grammar.cut_operator(&cut_operator_built)?;
self.push(ASTType::CutOperator(cut_operator_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn user_type_declaration(
&mut self,
_colon: &ParseTreeType<'t>,
_user_type_name: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let user_type_name = pop_item!(self, user_type_name, UserTypeName, context);
let user_type_declaration_built = UserTypeDeclaration {
user_type_name: (&user_type_name)
.try_into()
.map_err(parol_runtime::ParolError::UserError)?,
};
self.user_grammar
.user_type_declaration(&user_type_declaration_built)?;
self.push(
ASTType::UserTypeDeclaration(user_type_declaration_built),
context,
);
Ok(())
}
#[parol_runtime::function_name::named]
fn user_type_name(
&mut self,
_identifier: &ParseTreeType<'t>,
_user_type_name_list: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let user_type_name_list =
pop_and_reverse_item!(self, user_type_name_list, UserTypeNameList, context);
let identifier = pop_item!(self, identifier, Identifier, context);
let user_type_name_built = UserTypeName {
identifier: Box::new(identifier),
user_type_name_list,
};
self.user_grammar.user_type_name(&user_type_name_built)?;
self.push(ASTType::UserTypeName(user_type_name_built), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn user_type_name_list_0(
&mut self,
_double_colon: &ParseTreeType<'t>,
_identifier: &ParseTreeType<'t>,
_user_type_name_list: &ParseTreeType<'t>,
) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let mut user_type_name_list =
pop_item!(self, user_type_name_list, UserTypeNameList, context);
let identifier = pop_item!(self, identifier, Identifier, context);
self.pop(context);
let user_type_name_list_0_built = UserTypeNameList {
identifier: Box::new(identifier),
};
user_type_name_list.push(user_type_name_list_0_built);
self.push(ASTType::UserTypeNameList(user_type_name_list), context);
Ok(())
}
#[parol_runtime::function_name::named]
fn user_type_name_list_1(&mut self) -> Result<()> {
let context = function_name!();
trace!("{}", self.trace_item_stack(context));
let user_type_name_list_1_built = Vec::new();
self.push(
ASTType::UserTypeNameList(user_type_name_list_1_built),
context,
);
Ok(())
}
}
impl<'t> UserActionsTrait<'t> for ParolGrammarAuto<'t, '_> {
fn call_semantic_action_for_production_number(
&mut self,
prod_num: usize,
children: &[ParseTreeType<'t>],
) -> Result<()> {
match prod_num {
0 => self.parol(&children[0], &children[1]),
1 => self.prolog(&children[0], &children[1], &children[2]),
2 => self.prolog_list0_0(&children[0], &children[1]),
3 => self.prolog_list0_1(),
4 => self.prolog_list_0(&children[0], &children[1]),
5 => self.prolog_list_1(),
6 => self.start_declaration(&children[0], &children[1]),
7 => self.declaration_0(&children[0], &children[1]),
8 => self.declaration_1(&children[0], &children[1]),
9 => self.declaration_2(&children[0], &children[1], &children[2], &children[3]),
10 => self.declaration_3(&children[0]),
11 => self.scanner_directives_0(&children[0], &children[1]),
12 => self.scanner_directives_1(&children[0], &children[1], &children[2]),
13 => self.scanner_directives_2(&children[0]),
14 => self.scanner_directives_3(&children[0]),
15 => self.grammar_definition(&children[0], &children[1], &children[2]),
16 => self.grammar_definition_list_0(&children[0], &children[1]),
17 => self.grammar_definition_list_1(),
18 => self.double_colon(&children[0]),
19 => self.production(&children[0], &children[1], &children[2], &children[3]),
20 => self.alternations(&children[0], &children[1]),
21 => self.alternations_list_0(&children[0], &children[1], &children[2]),
22 => self.alternations_list_1(),
23 => self.alternation(&children[0]),
24 => self.alternation_list_0(&children[0], &children[1]),
25 => self.alternation_list_1(),
26 => self.factor_0(&children[0]),
27 => self.factor_1(&children[0]),
28 => self.factor_2(&children[0]),
29 => self.factor_3(&children[0]),
30 => self.symbol_0(&children[0]),
31 => self.symbol_1(&children[0]),
32 => self.symbol_2(&children[0]),
33 => self.symbol_3(&children[0]),
34 => self.token_literal_0(&children[0]),
35 => self.token_literal_1(&children[0]),
36 => self.token_literal_2(&children[0]),
37 => self.simple_token(&children[0], &children[1]),
38 => self.simple_token_opt_0(&children[0]),
39 => self.simple_token_opt_1(),
40 => self.token_with_states(
&children[0],
&children[1],
&children[2],
&children[3],
&children[4],
),
41 => self.token_with_states_opt_0(&children[0]),
42 => self.token_with_states_opt_1(),
43 => self.string(&children[0]),
44 => self.raw_string(&children[0]),
45 => self.regex(&children[0]),
46 => self.group(&children[0], &children[1], &children[2]),
47 => self.optional(&children[0], &children[1], &children[2]),
48 => self.repeat(&children[0], &children[1], &children[2]),
49 => self.non_terminal(&children[0], &children[1]),
50 => self.non_terminal_opt_0(&children[0]),
51 => self.non_terminal_opt_1(),
52 => self.identifier(&children[0]),
53 => self.scanner_state(
&children[0],
&children[1],
&children[2],
&children[3],
&children[4],
),
54 => self.scanner_state_list_0(&children[0], &children[1]),
55 => self.scanner_state_list_1(),
56 => self.state_list(&children[0], &children[1]),
57 => self.state_list_list_0(&children[0], &children[1], &children[2]),
58 => self.state_list_list_1(),
59 => self.scanner_switch_0(&children[0], &children[1], &children[2], &children[3]),
60 => self.scanner_switch_1(&children[0], &children[1], &children[2], &children[3]),
61 => self.scanner_switch_2(&children[0], &children[1], &children[2]),
62 => self.scanner_switch_opt_0(&children[0]),
63 => self.scanner_switch_opt_1(),
64 => self.a_s_t_control_0(&children[0]),
65 => self.a_s_t_control_1(&children[0]),
66 => self.cut_operator(&children[0]),
67 => self.user_type_declaration(&children[0], &children[1]),
68 => self.user_type_name(&children[0], &children[1]),
69 => self.user_type_name_list_0(&children[0], &children[1], &children[2]),
70 => self.user_type_name_list_1(),
_ => Err(ParserError::InternalError(format!(
"Unhandled production number: {}",
prod_num
))
.into()),
}
}
fn on_comment_parsed(&mut self, token: Token<'t>) {
self.user_grammar.on_comment_parsed(token)
}
}