use parol_runtime::{
ParolError, ParseTree, TokenStream,
parser::{
LLKParser, LookaheadDFA, ParseType, Production, Trans, parse_tree_type::TreeConstruct,
},
};
use scnr2::scanner;
use std::path::Path;
use crate::raa_tt_grammar::RaaTtGrammar;
use crate::raa_tt_grammar_trait::RaaTtGrammarAuto;
pub const TERMINAL_NAMES: &[&str; 14] = &[
"EndOfInput",
"Newline",
"Whitespace",
"LineComment",
"BlockComment",
"Not",
"And",
"Or",
"Cond",
"BiCond",
"LPar",
"RPar",
"Var",
"Error",
];
scanner! {
RaaTtGrammarScanner {
mode INITIAL {
token r"\r\n|\r|\n" => 1; token r"[\s--\r\n]+" => 2; token r"//.*(\r\n|\r|\n)?" => 3; token r"!" => 5; token r"\&" => 6; token r"\|" => 7; token r"\->" => 8; token r"<\->" => 9; token r"\(" => 10; token r"\)" => 11; token r"[a-z][_a-zA-Z0-9]*" => 12; token r"." => 13; }
}
}
const MAX_K: usize = 1;
pub const NON_TERMINALS: &[&str; 20] = &[
"And",
"BiCond",
"Biconditional",
"BiconditionalList",
"Cond",
"Conditional",
"ConditionalList",
"Conjunction",
"ConjunctionList",
"Disjunction",
"DisjunctionList",
"Factor",
"LPar",
"Negation",
"Not",
"Or",
"RPar",
"RaaTt",
"RaaTtList",
"Var",
];
pub const LOOKAHEAD_AUTOMATA: &[LookaheadDFA; 20] = &[
LookaheadDFA {
prod0: 1,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: 4,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: 11,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: -1,
transitions: &[
Trans(0, 0, 2, 13),
Trans(0, 5, 2, 13),
Trans(0, 9, 1, 12),
Trans(0, 10, 2, 13),
Trans(0, 11, 2, 13),
Trans(0, 12, 2, 13),
],
k: 1,
},
LookaheadDFA {
prod0: 3,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: 14,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: -1,
transitions: &[
Trans(0, 0, 2, 16),
Trans(0, 5, 2, 16),
Trans(0, 8, 1, 15),
Trans(0, 9, 2, 16),
Trans(0, 10, 2, 16),
Trans(0, 11, 2, 16),
Trans(0, 12, 2, 16),
],
k: 1,
},
LookaheadDFA {
prod0: 20,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: -1,
transitions: &[
Trans(0, 0, 2, 22),
Trans(0, 5, 2, 22),
Trans(0, 6, 1, 21),
Trans(0, 7, 2, 22),
Trans(0, 8, 2, 22),
Trans(0, 9, 2, 22),
Trans(0, 10, 2, 22),
Trans(0, 11, 2, 22),
Trans(0, 12, 2, 22),
],
k: 1,
},
LookaheadDFA {
prod0: 17,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: -1,
transitions: &[
Trans(0, 0, 2, 19),
Trans(0, 5, 2, 19),
Trans(0, 7, 1, 18),
Trans(0, 8, 2, 19),
Trans(0, 9, 2, 19),
Trans(0, 10, 2, 19),
Trans(0, 11, 2, 19),
Trans(0, 12, 2, 19),
],
k: 1,
},
LookaheadDFA {
prod0: -1,
transitions: &[Trans(0, 5, 2, 25), Trans(0, 10, 3, 26), Trans(0, 12, 1, 24)],
k: 1,
},
LookaheadDFA {
prod0: 5,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: 23,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: 0,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: 2,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: 6,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: 8,
transitions: &[],
k: 0,
},
LookaheadDFA {
prod0: -1,
transitions: &[
Trans(0, 0, 2, 10),
Trans(0, 5, 1, 9),
Trans(0, 10, 1, 9),
Trans(0, 12, 1, 9),
],
k: 1,
},
LookaheadDFA {
prod0: 7,
transitions: &[],
k: 0,
},
];
pub const PRODUCTIONS: &[Production; 27] = &[
Production {
lhs: 14,
production: &[ParseType::T(5)],
},
Production {
lhs: 0,
production: &[ParseType::T(6)],
},
Production {
lhs: 15,
production: &[ParseType::T(7)],
},
Production {
lhs: 4,
production: &[ParseType::T(8)],
},
Production {
lhs: 1,
production: &[ParseType::T(9)],
},
Production {
lhs: 12,
production: &[ParseType::T(10)],
},
Production {
lhs: 16,
production: &[ParseType::T(11)],
},
Production {
lhs: 19,
production: &[ParseType::T(12)],
},
Production {
lhs: 17,
production: &[ParseType::N(18)],
},
Production {
lhs: 18,
production: &[ParseType::N(18), ParseType::N(2)],
},
Production {
lhs: 18,
production: &[],
},
Production {
lhs: 2,
production: &[ParseType::N(3), ParseType::N(5)],
},
Production {
lhs: 3,
production: &[ParseType::N(3), ParseType::N(5), ParseType::N(1)],
},
Production {
lhs: 3,
production: &[],
},
Production {
lhs: 5,
production: &[ParseType::N(6), ParseType::N(9)],
},
Production {
lhs: 6,
production: &[ParseType::N(6), ParseType::N(9), ParseType::N(4)],
},
Production {
lhs: 6,
production: &[],
},
Production {
lhs: 9,
production: &[ParseType::N(10), ParseType::N(7)],
},
Production {
lhs: 10,
production: &[ParseType::N(10), ParseType::N(7), ParseType::N(15)],
},
Production {
lhs: 10,
production: &[],
},
Production {
lhs: 7,
production: &[ParseType::N(8), ParseType::N(11)],
},
Production {
lhs: 8,
production: &[ParseType::N(8), ParseType::N(11), ParseType::N(0)],
},
Production {
lhs: 8,
production: &[],
},
Production {
lhs: 13,
production: &[ParseType::N(11), ParseType::N(14)],
},
Production {
lhs: 11,
production: &[ParseType::N(19)],
},
Production {
lhs: 11,
production: &[ParseType::N(13)],
},
Production {
lhs: 11,
production: &[ParseType::N(16), ParseType::N(2), ParseType::N(12)],
},
];
pub fn parse<'t, T>(
input: &'t str,
file_name: T,
user_actions: &mut RaaTtGrammar<'t>,
) -> Result<ParseTree, ParolError>
where
T: AsRef<Path>,
{
use parol_runtime::{
parser::{parse_tree_type::SynTree, parser_types::SynTreeFlavor},
syntree::Builder,
};
let mut builder = Builder::<SynTree, SynTreeFlavor>::new_with();
parse_into(input, &mut builder, file_name, user_actions)?;
Ok(builder.build()?)
}
#[allow(dead_code)]
pub fn parse_into<'t, T: TreeConstruct<'t>>(
input: &'t str,
tree_builder: &mut T,
file_name: impl AsRef<Path>,
user_actions: &mut RaaTtGrammar<'t>,
) -> Result<(), ParolError>
where
ParolError: From<T::Error>,
{
use raa_tt_grammar_scanner::RaaTtGrammarScanner;
let mut llk_parser = LLKParser::new(
17,
LOOKAHEAD_AUTOMATA,
PRODUCTIONS,
TERMINAL_NAMES,
NON_TERMINALS,
);
llk_parser.trim_parse_tree();
let scanner = RaaTtGrammarScanner::new();
let mut user_actions = RaaTtGrammarAuto::new(user_actions);
llk_parser.parse_into(
tree_builder,
TokenStream::new(
input,
file_name,
scanner.scanner_impl.clone(),
&RaaTtGrammarScanner::match_function,
MAX_K,
)
.unwrap(),
&mut user_actions,
)
}