use parol_runtime::id_tree::Tree;
use parol_runtime::lexer::{TokenStream, Tokenizer};
use parol_runtime::once_cell::sync::Lazy;
#[allow(unused_imports)]
use parol_runtime::parser::{
DFATransition, LLKParser, LookaheadDFA, ParseTreeType, ParseType, Production,
};
use parol_runtime::Result;
use std::cell::RefCell;
use std::path::Path;
use crate::parser::parol_grammar::ParolGrammar;
use crate::parser::parol_grammar_trait::ParolGrammarAuto;
use parol_runtime::lexer::tokenizer::{
ERROR_TOKEN, NEW_LINE_TOKEN, UNMATCHABLE_TOKEN, WHITESPACE_TOKEN,
};
pub const TERMINALS: &[&str; 38] = &[
UNMATCHABLE_TOKEN,
UNMATCHABLE_TOKEN,
UNMATCHABLE_TOKEN,
UNMATCHABLE_TOKEN,
UNMATCHABLE_TOKEN,
r###"%start"###,
r###"%title"###,
r###"%comment"###,
r###"%user_type"###,
r###"="###,
r###"%line_comment"###,
r###"%block_comment"###,
r###"%auto_newline_off"###,
r###"%auto_ws_off"###,
r###"%%"###,
r###"::"###,
r###":"###,
r###";"###,
r###"\|"###,
r###"<"###,
r###">"###,
r###""(\\.|[^\\])*?""###,
r###"'(\\'|[^'])*?'"###,
r###"\u{2F}(\\.|[^\\]|)*?\u{2F}"###,
r###"\("###,
r###"\)"###,
r###"\["###,
r###"\]"###,
r###"\{"###,
r###"\}"###,
r###"[a-zA-Z_][a-zA-Z0-9_]*"###,
r###"%scanner"###,
r###","###,
r###"%sc"###,
r###"%push"###,
r###"%pop"###,
r###"\^"###,
ERROR_TOKEN,
];
pub const TERMINAL_NAMES: &[&str; 38] = &[
"EndOfInput",
"Newline",
"Whitespace",
"LineComment",
"BlockComment",
"PercentStart",
"PercentTitle",
"PercentComment",
"PercentUserUnderscoreType",
"Equ",
"PercentLineUnderscoreComment",
"PercentBlockUnderscoreComment",
"PercentAutoUnderscoreNewlineUnderscoreOff",
"PercentAutoUnderscoreWsUnderscoreOff",
"PercentPercent",
"DoubleColon",
"Colon",
"Semicolon",
"Or",
"LT",
"GT",
"String",
"RawString",
"Regex",
"LParen",
"RParen",
"LBracket",
"RBracket",
"LBrace",
"RBrace",
"Identifier",
"PercentScanner",
"Comma",
"PercentSc",
"PercentPush",
"PercentPop",
"Circumflex",
"Error",
];
const SCANNER_0: (&[&str; 5], &[usize; 32]) = (
&[
UNMATCHABLE_TOKEN,
NEW_LINE_TOKEN,
WHITESPACE_TOKEN,
r###"(//.*(\r\n|\r|\n|$))"###,
r###"((?ms)/\*.*?\*/)"###,
],
&[
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,
],
);
const MAX_K: usize = 1;
pub const NON_TERMINALS: &[&str; 42] = &[
"ASTControl",
"Alternation",
"AlternationList",
"Alternations",
"AlternationsList",
"CutOperator",
"Declaration",
"DoubleColon",
"Factor",
"GrammarDefinition",
"GrammarDefinitionList",
"Group",
"Identifier",
"NonTerminal",
"NonTerminalOpt",
"Optional",
"Parol",
"Production",
"Prolog",
"PrologList",
"PrologList0",
"RawString",
"Regex",
"Repeat",
"ScannerDirectives",
"ScannerState",
"ScannerStateList",
"ScannerSwitch",
"ScannerSwitchOpt",
"SimpleToken",
"SimpleTokenOpt",
"StartDeclaration",
"StateList",
"StateListList",
"String",
"Symbol",
"TokenLiteral",
"TokenWithStates",
"TokenWithStatesOpt",
"UserTypeDeclaration",
"UserTypeName",
"UserTypeNameList",
];
pub const LOOKAHEAD_AUTOMATA: &[LookaheadDFA; 42] = &[
LookaheadDFA {
states: &[None, Some(64), Some(65)],
transitions: &[DFATransition(0, 16, 2), DFATransition(0, 36, 1)],
k: 1,
},
LookaheadDFA {
states: &[Some(23)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(24), Some(25)],
transitions: &[
DFATransition(0, 17, 2),
DFATransition(0, 18, 2),
DFATransition(0, 19, 1),
DFATransition(0, 21, 1),
DFATransition(0, 22, 1),
DFATransition(0, 23, 1),
DFATransition(0, 24, 1),
DFATransition(0, 25, 2),
DFATransition(0, 26, 1),
DFATransition(0, 27, 2),
DFATransition(0, 28, 1),
DFATransition(0, 29, 2),
DFATransition(0, 30, 1),
DFATransition(0, 33, 1),
DFATransition(0, 34, 1),
DFATransition(0, 35, 1),
],
k: 1,
},
LookaheadDFA {
states: &[Some(20)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(21), Some(22)],
transitions: &[
DFATransition(0, 17, 2),
DFATransition(0, 18, 1),
DFATransition(0, 25, 2),
DFATransition(0, 27, 2),
DFATransition(0, 29, 2),
],
k: 1,
},
LookaheadDFA {
states: &[Some(66)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(7), Some(8), Some(9), Some(10)],
transitions: &[
DFATransition(0, 6, 1),
DFATransition(0, 7, 2),
DFATransition(0, 8, 3),
DFATransition(0, 10, 4),
DFATransition(0, 11, 4),
DFATransition(0, 12, 4),
DFATransition(0, 13, 4),
],
k: 1,
},
LookaheadDFA {
states: &[Some(18)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(26), Some(27), Some(28), Some(29)],
transitions: &[
DFATransition(0, 19, 4),
DFATransition(0, 21, 4),
DFATransition(0, 22, 4),
DFATransition(0, 23, 4),
DFATransition(0, 24, 1),
DFATransition(0, 26, 3),
DFATransition(0, 28, 2),
DFATransition(0, 30, 4),
DFATransition(0, 33, 4),
DFATransition(0, 34, 4),
DFATransition(0, 35, 4),
],
k: 1,
},
LookaheadDFA {
states: &[Some(15)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(16), Some(17)],
transitions: &[DFATransition(0, 0, 2), DFATransition(0, 30, 1)],
k: 1,
},
LookaheadDFA {
states: &[Some(46)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[Some(52)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[Some(49)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(50), Some(51)],
transitions: &[
DFATransition(0, 16, 1),
DFATransition(0, 17, 2),
DFATransition(0, 18, 2),
DFATransition(0, 19, 2),
DFATransition(0, 21, 2),
DFATransition(0, 22, 2),
DFATransition(0, 23, 2),
DFATransition(0, 24, 2),
DFATransition(0, 25, 2),
DFATransition(0, 26, 2),
DFATransition(0, 27, 2),
DFATransition(0, 28, 2),
DFATransition(0, 29, 2),
DFATransition(0, 30, 2),
DFATransition(0, 33, 2),
DFATransition(0, 34, 2),
DFATransition(0, 35, 2),
DFATransition(0, 36, 1),
],
k: 1,
},
LookaheadDFA {
states: &[Some(47)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[Some(0)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[Some(19)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[Some(1)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(4), Some(5)],
transitions: &[
DFATransition(0, 6, 1),
DFATransition(0, 7, 1),
DFATransition(0, 8, 1),
DFATransition(0, 10, 1),
DFATransition(0, 11, 1),
DFATransition(0, 12, 1),
DFATransition(0, 13, 1),
DFATransition(0, 14, 2),
DFATransition(0, 31, 2),
],
k: 1,
},
LookaheadDFA {
states: &[None, Some(2), Some(3)],
transitions: &[DFATransition(0, 14, 2), DFATransition(0, 31, 1)],
k: 1,
},
LookaheadDFA {
states: &[Some(44)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[Some(45)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[Some(48)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(11), Some(12), Some(13), Some(14)],
transitions: &[
DFATransition(0, 10, 1),
DFATransition(0, 11, 2),
DFATransition(0, 12, 3),
DFATransition(0, 13, 4),
],
k: 1,
},
LookaheadDFA {
states: &[Some(53)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(54), Some(55)],
transitions: &[
DFATransition(0, 10, 1),
DFATransition(0, 11, 1),
DFATransition(0, 12, 1),
DFATransition(0, 13, 1),
DFATransition(0, 29, 2),
],
k: 1,
},
LookaheadDFA {
states: &[None, Some(59), Some(60), Some(61)],
transitions: &[
DFATransition(0, 33, 1),
DFATransition(0, 34, 2),
DFATransition(0, 35, 3),
],
k: 1,
},
LookaheadDFA {
states: &[None, Some(62), Some(63)],
transitions: &[DFATransition(0, 25, 2), DFATransition(0, 30, 1)],
k: 1,
},
LookaheadDFA {
states: &[Some(37)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(38), Some(39)],
transitions: &[
DFATransition(0, 16, 1),
DFATransition(0, 17, 2),
DFATransition(0, 18, 2),
DFATransition(0, 19, 2),
DFATransition(0, 21, 2),
DFATransition(0, 22, 2),
DFATransition(0, 23, 2),
DFATransition(0, 24, 2),
DFATransition(0, 25, 2),
DFATransition(0, 26, 2),
DFATransition(0, 27, 2),
DFATransition(0, 28, 2),
DFATransition(0, 29, 2),
DFATransition(0, 30, 2),
DFATransition(0, 33, 2),
DFATransition(0, 34, 2),
DFATransition(0, 35, 2),
DFATransition(0, 36, 1),
],
k: 1,
},
LookaheadDFA {
states: &[Some(6)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[Some(56)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(57), Some(58)],
transitions: &[DFATransition(0, 20, 2), DFATransition(0, 32, 1)],
k: 1,
},
LookaheadDFA {
states: &[Some(43)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(30), Some(31), Some(32), Some(33)],
transitions: &[
DFATransition(0, 19, 3),
DFATransition(0, 21, 2),
DFATransition(0, 22, 2),
DFATransition(0, 23, 2),
DFATransition(0, 30, 1),
DFATransition(0, 33, 4),
DFATransition(0, 34, 4),
DFATransition(0, 35, 4),
],
k: 1,
},
LookaheadDFA {
states: &[None, Some(34), Some(35), Some(36)],
transitions: &[
DFATransition(0, 21, 1),
DFATransition(0, 22, 2),
DFATransition(0, 23, 3),
],
k: 1,
},
LookaheadDFA {
states: &[Some(40)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(41), Some(42)],
transitions: &[
DFATransition(0, 16, 1),
DFATransition(0, 17, 2),
DFATransition(0, 18, 2),
DFATransition(0, 19, 2),
DFATransition(0, 21, 2),
DFATransition(0, 22, 2),
DFATransition(0, 23, 2),
DFATransition(0, 24, 2),
DFATransition(0, 25, 2),
DFATransition(0, 26, 2),
DFATransition(0, 27, 2),
DFATransition(0, 28, 2),
DFATransition(0, 29, 2),
DFATransition(0, 30, 2),
DFATransition(0, 33, 2),
DFATransition(0, 34, 2),
DFATransition(0, 35, 2),
DFATransition(0, 36, 1),
],
k: 1,
},
LookaheadDFA {
states: &[Some(67)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[Some(68)],
transitions: &[],
k: 0,
},
LookaheadDFA {
states: &[None, Some(69), Some(70)],
transitions: &[
DFATransition(0, 6, 2),
DFATransition(0, 7, 2),
DFATransition(0, 8, 2),
DFATransition(0, 10, 2),
DFATransition(0, 11, 2),
DFATransition(0, 12, 2),
DFATransition(0, 13, 2),
DFATransition(0, 14, 2),
DFATransition(0, 15, 1),
DFATransition(0, 17, 2),
DFATransition(0, 18, 2),
DFATransition(0, 19, 2),
DFATransition(0, 21, 2),
DFATransition(0, 22, 2),
DFATransition(0, 23, 2),
DFATransition(0, 24, 2),
DFATransition(0, 25, 2),
DFATransition(0, 26, 2),
DFATransition(0, 27, 2),
DFATransition(0, 28, 2),
DFATransition(0, 29, 2),
DFATransition(0, 30, 2),
DFATransition(0, 31, 2),
DFATransition(0, 33, 2),
DFATransition(0, 34, 2),
DFATransition(0, 35, 2),
],
k: 1,
},
];
pub const PRODUCTIONS: &[Production; 71] = &[
Production {
lhs: 16,
production: &[ParseType::N(9), ParseType::N(18)],
},
Production {
lhs: 18,
production: &[ParseType::N(20), ParseType::N(19), ParseType::N(31)],
},
Production {
lhs: 20,
production: &[ParseType::N(20), ParseType::N(25)],
},
Production {
lhs: 20,
production: &[],
},
Production {
lhs: 19,
production: &[ParseType::N(19), ParseType::N(6)],
},
Production {
lhs: 19,
production: &[],
},
Production {
lhs: 31,
production: &[ParseType::N(12), ParseType::T(5)],
},
Production {
lhs: 6,
production: &[ParseType::N(34), ParseType::T(6)],
},
Production {
lhs: 6,
production: &[ParseType::N(34), ParseType::T(7)],
},
Production {
lhs: 6,
production: &[
ParseType::N(40),
ParseType::T(9),
ParseType::N(12),
ParseType::T(8),
],
},
Production {
lhs: 6,
production: &[ParseType::N(24)],
},
Production {
lhs: 24,
production: &[ParseType::N(36), ParseType::T(10)],
},
Production {
lhs: 24,
production: &[ParseType::N(36), ParseType::N(36), ParseType::T(11)],
},
Production {
lhs: 24,
production: &[ParseType::T(12)],
},
Production {
lhs: 24,
production: &[ParseType::T(13)],
},
Production {
lhs: 9,
production: &[ParseType::N(10), ParseType::N(17), ParseType::T(14)],
},
Production {
lhs: 10,
production: &[ParseType::N(10), ParseType::N(17)],
},
Production {
lhs: 10,
production: &[],
},
Production {
lhs: 7,
production: &[ParseType::T(15)],
},
Production {
lhs: 17,
production: &[
ParseType::T(17),
ParseType::N(3),
ParseType::T(16),
ParseType::N(12),
],
},
Production {
lhs: 3,
production: &[ParseType::N(4), ParseType::N(1)],
},
Production {
lhs: 4,
production: &[ParseType::N(4), ParseType::N(1), ParseType::T(18)],
},
Production {
lhs: 4,
production: &[],
},
Production {
lhs: 1,
production: &[ParseType::N(2)],
},
Production {
lhs: 2,
production: &[ParseType::N(2), ParseType::N(8)],
},
Production {
lhs: 2,
production: &[],
},
Production {
lhs: 8,
production: &[ParseType::N(11)],
},
Production {
lhs: 8,
production: &[ParseType::N(23)],
},
Production {
lhs: 8,
production: &[ParseType::N(15)],
},
Production {
lhs: 8,
production: &[ParseType::N(35)],
},
Production {
lhs: 35,
production: &[ParseType::N(13)],
},
Production {
lhs: 35,
production: &[ParseType::N(29)],
},
Production {
lhs: 35,
production: &[ParseType::N(37)],
},
Production {
lhs: 35,
production: &[ParseType::N(27)],
},
Production {
lhs: 36,
production: &[ParseType::N(34)],
},
Production {
lhs: 36,
production: &[ParseType::N(21)],
},
Production {
lhs: 36,
production: &[ParseType::N(22)],
},
Production {
lhs: 29,
production: &[ParseType::N(30), ParseType::N(36)],
},
Production {
lhs: 30,
production: &[ParseType::N(0)],
},
Production {
lhs: 30,
production: &[],
},
Production {
lhs: 37,
production: &[
ParseType::N(38),
ParseType::N(36),
ParseType::T(20),
ParseType::N(32),
ParseType::T(19),
],
},
Production {
lhs: 38,
production: &[ParseType::N(0)],
},
Production {
lhs: 38,
production: &[],
},
Production {
lhs: 34,
production: &[ParseType::T(21)],
},
Production {
lhs: 21,
production: &[ParseType::T(22)],
},
Production {
lhs: 22,
production: &[ParseType::T(23)],
},
Production {
lhs: 11,
production: &[ParseType::T(25), ParseType::N(3), ParseType::T(24)],
},
Production {
lhs: 15,
production: &[ParseType::T(27), ParseType::N(3), ParseType::T(26)],
},
Production {
lhs: 23,
production: &[ParseType::T(29), ParseType::N(3), ParseType::T(28)],
},
Production {
lhs: 13,
production: &[ParseType::N(14), ParseType::N(12)],
},
Production {
lhs: 14,
production: &[ParseType::N(0)],
},
Production {
lhs: 14,
production: &[],
},
Production {
lhs: 12,
production: &[ParseType::T(30)],
},
Production {
lhs: 25,
production: &[
ParseType::T(29),
ParseType::N(26),
ParseType::T(28),
ParseType::N(12),
ParseType::T(31),
],
},
Production {
lhs: 26,
production: &[ParseType::N(26), ParseType::N(24)],
},
Production {
lhs: 26,
production: &[],
},
Production {
lhs: 32,
production: &[ParseType::N(33), ParseType::N(12)],
},
Production {
lhs: 33,
production: &[ParseType::N(33), ParseType::N(12), ParseType::T(32)],
},
Production {
lhs: 33,
production: &[],
},
Production {
lhs: 27,
production: &[
ParseType::T(25),
ParseType::N(28),
ParseType::T(24),
ParseType::T(33),
],
},
Production {
lhs: 27,
production: &[
ParseType::T(25),
ParseType::N(12),
ParseType::T(24),
ParseType::T(34),
],
},
Production {
lhs: 27,
production: &[ParseType::T(25), ParseType::T(24), ParseType::T(35)],
},
Production {
lhs: 28,
production: &[ParseType::N(12)],
},
Production {
lhs: 28,
production: &[],
},
Production {
lhs: 0,
production: &[ParseType::N(5)],
},
Production {
lhs: 0,
production: &[ParseType::N(39)],
},
Production {
lhs: 5,
production: &[ParseType::T(36)],
},
Production {
lhs: 39,
production: &[ParseType::N(40), ParseType::T(16)],
},
Production {
lhs: 40,
production: &[ParseType::N(41), ParseType::N(12)],
},
Production {
lhs: 41,
production: &[ParseType::N(41), ParseType::N(12), ParseType::N(7)],
},
Production {
lhs: 41,
production: &[],
},
];
static TOKENIZERS: Lazy<Vec<(&'static str, Tokenizer)>> = Lazy::new(|| {
vec![(
"INITIAL",
Tokenizer::build(TERMINALS, SCANNER_0.0, SCANNER_0.1).unwrap(),
)]
});
pub fn parse<'t, T>(
input: &'t str,
file_name: T,
user_actions: &mut ParolGrammar<'t>,
) -> Result<Tree<ParseTreeType<'t>>>
where
T: AsRef<Path>,
{
let mut llk_parser = LLKParser::new(
16,
LOOKAHEAD_AUTOMATA,
PRODUCTIONS,
TERMINAL_NAMES,
NON_TERMINALS,
);
let token_stream =
RefCell::new(TokenStream::new(input, file_name, &TOKENIZERS, MAX_K).unwrap());
let mut user_actions = ParolGrammarAuto::new(user_actions);
let result = llk_parser.parse(token_stream, &mut user_actions);
match result {
Ok(()) => Ok(llk_parser.parse_tree),
Err(e) => Err(e),
}
}