1mod tests;
8
9use std::collections::HashMap;
10use std::io::Cursor;
11use std::str::FromStr;
12use iter_index::IndexerIterator;
13use vectree::VecTree;
14use lexigram_core::CollectJoin;
15use crate::{General, NameFixer, NameTransformer, SymbolTable};
16use crate::{TokenId, VarId};
17use crate::grammar::{GrNode, GrTree, RuleTreeSet};
18use crate::char_reader::CharReader;
19use crate::lexer::{Lexer, TokenSpliterator};
20use lexigram_core::log::{BufLog, LogStatus, Logger};
21use crate::parser::{Parser, Symbol};
22use crate::rtsgen::listener_types::*;
23use crate::rtsgen::rtsgen_lexer::build_lexer;
24use crate::rtsgen::rtsgen_parser::*;
25
26static T_NAME_DICTIONARY: &[(&str, &str)] = &[
27 ("+", "Add"), ("-", "Sub"), ("*", "Mul"), ("/", "Div"), ("%", "Percent"), ("++", "Inc"), ("--", "Dec"),
28 ("<<", "Shl"), (">>", "Shr"), ("!", "Not"), ("^", "Exp"), ("~", "Tilde"),
29 ("&", "And"), ("|", "Or"), ("&&", "And2"), ("||", "Or2"),
30 ("=", "Eq"), ("==", "Eq2"), ("<", "Lt"), (">", "Gt"), ("<=", "LtEq"), (">=", "GtEq"), ("!=", "Neq"),
31 (":=", "ColonEq"), ("+=", "AddEq"), ("-=", "SubEq"), ("*=", "MulEq"), ("/=", "DivEq"),
32 ("(", "LPar"), (")", "RPar"), ("[", "LSBracket"), ("]", "RSBracker"), ("{", "LBracket"), ("}", "RBracket"),
33 ("\"", "DQuote"), ("'", "Quote"), ("$", "Dollar"), ("?", "Question"), ("\\", "Backslash"),
34 (":", "Colon"), (";", "SemiColon"), (".", "Dot"), (",", "Comma"), ("#", "Sharp"), ("@", "At"), ("´", "Tick"), ("`", "BTick"),
35 ("\n", "EOL"), ("\r\n", "WinEOL"), ("\r", "CR"), ("\t", "Tab"), (" ", "Space"), ("\\", "Backslash"), ("\0", "Null"),
36 ("->", "Arrow"), ("=>", "DArrow"),
37];
38
39pub struct RtsGen<'l, 'p> {
40 lexer: Lexer<'l, Cursor<String>>,
41 parser: Parser<'p>,
42 t_name_dictionary: Option<HashMap<String, String>>,
43}
44
45impl RtsGen<'_, '_> {
46 pub fn new() -> Self {
47 let t_name_dictionary = Some(HashMap::from_iter(T_NAME_DICTIONARY.into_iter().map(|(a, b)| (a.to_string(), b.to_string()))));
48 RtsGen::with_guess_names(t_name_dictionary)
49 }
50
51 pub fn with_guess_names(t_name_dictionary: Option<HashMap<String, String>>) -> Self {
52 let lexer = build_lexer();
53 let parser = build_parser();
54 RtsGen { lexer, parser, t_name_dictionary }
55 }
56
57 pub fn parse(&mut self, text: String) -> Result<RuleTreeSet<General>, BufLog> {
58 const VERBOSE_WRAPPER: bool = false;
59
60 let mut wrapper = Wrapper::new(RGListener::new(self.t_name_dictionary.as_ref()), VERBOSE_WRAPPER);
61 let stream = CharReader::new(Cursor::new(text));
62 self.lexer.attach_stream(stream);
63 let tokens = self.lexer.tokens().split_channel0(|(_tok, ch, text, pos_span)|
64 panic!("unexpected channel {ch} while parsing a file at {pos_span}, \"{text}\"")
65 );
66 let _ = self.parser.parse_stream(&mut wrapper, tokens); let listener = wrapper.give_listener();
68 listener.make_rts()
69 }
70}
71
72struct RGListener<'a> {
75 log: BufLog,
76 nt: HashMap<String, VarId>,
77 nt_def_order: Vec<VarId>,
78 rules: Vec<GrTree>,
79 reserved_nt: Vec<VarId>,
80 symbol_table: Option<SymbolTable>,
81 t: HashMap<String, TokenId>,
82 num_t: usize,
83 tokens: Vec<(String, Option<String>)>,
85 curr: Option<GrTree>,
86 curr_name: Option<String>,
87 curr_nt: Option<VarId>,
88 t_name_dictionary: Option<&'a HashMap<String, String>>,
89}
90
91#[derive(Clone, Copy, PartialEq)]
92enum IsNew { No, Yes }
93
94trait ToVarId {
95 fn to_var_id(self, panic_message: &str) -> VarId;
96}
97
98impl ToVarId for usize {
99 fn to_var_id(self, panic_message: &str) -> VarId {
100 if self < (VarId::MAX as usize) {
101 self as VarId
102 } else {
103 panic!("{panic_message}")
104 }
105 }
106}
107
108impl<'a> RGListener<'a> {
109 fn new(t_name_dictionary: Option<&'a HashMap<String, String>>) -> Self {
110 RGListener {
111 log: BufLog::new(),
112 nt: HashMap::new(),
113 nt_def_order: Vec::new(),
114 rules: Vec::new(),
115 reserved_nt: Vec::new(),
116 symbol_table: None,
117 t: HashMap::new(),
118 num_t: 0,
119 tokens: Vec::new(),
120 curr: None,
121 curr_name: None,
122 curr_nt: None,
123 t_name_dictionary,
124 }
125 }
126
127 pub fn make_rts(self) -> Result<RuleTreeSet<General>, BufLog> {
128 let RGListener { log, rules, symbol_table, .. } = self;
129 if log.has_no_errors() {
130 let mut rts = RuleTreeSet::<General>::with_log(log);
131 rts.set_symbol_table(symbol_table.unwrap());
132 rts.set_start(0);
133 for (var, rule) in rules.into_iter().index::<VarId>() {
134 rts.set_tree(var, rule);
135 }
136 Ok(rts)
137 } else {
138 Err(log)
139 }
140 }
141
142 fn get_or_create_nt(&mut self, name: String) -> VarId {
145 let size = self.nt.len();
146 let var = *self.nt.entry(name).or_insert_with(|| {
147 self.rules.push(GrTree::new());
148 size.to_var_id("too many nonterminals")
149 });
150 var
151 }
152
153 fn get_or_create_t(&mut self, name: String) -> (IsNew, TokenId) {
160 let mut is_new = IsNew::No;
161 let tok = *self.t.entry(name).or_insert_with(|| {
162 is_new = IsNew::Yes;
163 let tok = self.num_t.to_var_id("too many terminals"); self.num_t += 1;
165 tok
166 });
167 (is_new, tok)
168 }
169
170 fn invent_t_name(&self, tok: TokenId, value: &str) -> String {
171 self.t_name_dictionary
172 .and_then(|g| g.get(value).cloned())
173 .unwrap_or_else(|| {
174 if value.chars().any(|c| c.is_ascii_alphanumeric()) &&
175 value.chars().all(|c| c.is_ascii_alphanumeric() || c.is_whitespace() || c == '_')
176 {
177 let name = value.chars().map(|c| if c.is_whitespace() { '_' } else { c }).collect::<String>();
178 if !value.as_bytes()[0].is_ascii_alphabetic() {
179 format!("Tok{}", name.to_camelcase())
180 } else {
181 name.to_camelcase()
182 }
183 } else {
184 format!("Token{tok}")
185 }
186 })
187 }
188
189 fn finalize_ruleset(&mut self) {
191 let mut nt_name = vec![String::new(); self.nt.len()];
192 let mut dest = vec![0; self.nt.len()];
193 self.nt_def_order.iter().enumerate().for_each(|(i, &nt)| dest[nt as usize] = i);
194 for (name, var) in &self.nt {
195 nt_name[dest[*var as usize]] = name.clone();
196 }
197
198 let mut undefined = self.nt.iter()
200 .filter_map(|(name, &var)| if self.rules[var as usize].is_empty() { Some(name.to_string()) } else { None })
201 .to_vec();
202 if !undefined.is_empty() {
203 undefined.sort(); self.log.add_error(format!("undefined nonterminals: {}", undefined.into_iter().map(|s| format!("'{s}'")).join(", ")));
205 return;
206 }
207
208 assert_eq!(self.tokens.len(), self.num_t);
210 let mut symtab = SymbolTable::new();
211 symtab.extend_nonterminals(nt_name);
212 let mut t_name = vec![(String::new(), None); self.tokens.len()];
213 let mut namefixer = NameFixer::new_empty();
214 for (tok, (name, value_maybe)) in self.tokens.iter().enumerate().filter(|(_, (name, _))| !name.is_empty()) {
215 namefixer.add(name.clone());
216 t_name[tok] = (name.clone(), value_maybe.clone());
217 }
218
219 for (tok, (_, cst_maybe)) in self.tokens.iter().enumerate().filter(|(_, (name, _))| name.is_empty()) {
221 let new_name = namefixer.get_unique_name(self.invent_t_name(tok as TokenId, cst_maybe.as_ref().unwrap()));
222 t_name[tok] = (new_name, cst_maybe.clone());
223 }
224 symtab.extend_terminals(t_name);
225 self.symbol_table = Some(symtab);
226
227 for v in &self.reserved_nt {
229 self.rules[*v as usize].clear();
230 }
231
232 self.rules = self.nt_def_order.iter()
234 .map(|nt| std::mem::take(self.rules.get_mut(*nt as usize).unwrap()))
235 .collect();
236 for rule in &mut self.rules {
237 for mut node in rule.iter_depth_simple_mut() {
238 match *node {
239 GrNode::Symbol(Symbol::NT(ref mut old))
240 | GrNode::LForm(ref mut old) => *old = *dest.get(*old as usize).unwrap_or(&(*old as usize)) as VarId,
241 _ => {}
242 }
243 }
244 }
245 }
246}
247
248impl RtsGenListener for RGListener<'_> {
249 fn get_mut_log(&mut self) -> &mut impl Logger {
250 &mut self.log
251 }
252
253 fn exit(&mut self, _ruleset: SynFile) {
254 self.finalize_ruleset();
255 }
256
257 fn exit_file(&mut self, _ctx: CtxFile) -> SynFile {
258 SynFile()
259 }
260
261 fn exit_decls(&mut self, _ctx: CtxDecls) -> SynDecls {
262 SynDecls()
263 }
264
265 fn exit_decl(&mut self, _ctx: CtxDecl) -> SynDecl {
266 SynDecl()
267 }
268
269 fn exit_decl_terminal(&mut self, ctx: CtxDeclTerminal) -> SynDeclTerminal {
270 match ctx {
271 CtxDeclTerminal::V1 { terminal, terminalcst } => {
273 if self.t.contains_key(&terminal) {
274 self.log.add_error(format!("token '{terminal}' already declared"));
275 } else if self.t.contains_key(&terminalcst) {
276 self.log.add_error(format!("token value {terminalcst} already used"));
277 } else {
278 let token = self.num_t.to_var_id("too many terminals");
279 self.num_t += 1;
280 self.tokens.push((terminal.clone(), Some(terminalcst[1..terminalcst.len() - 1].to_string())));
281 self.t.insert(terminal, token);
282 self.t.insert(terminalcst, token);
283 }
284
285 }
286 CtxDeclTerminal::V2 { terminal } => {
288 if self.t.contains_key(&terminal) {
289 self.log.add_error(format!("token '{terminal}' already declared"));
290 } else {
291 let token = self.num_t.to_var_id("too many terminals");
292 self.num_t += 1;
293 self.tokens.push((terminal.clone(), None));
294 self.t.insert(terminal, token);
295 }
296 }
297 };
298 SynDeclTerminal()
299 }
300
301 fn exit_ruleset(&mut self, _ctx: CtxRuleset) -> SynRuleset {
302 SynRuleset()
303 }
304
305 fn init_rule(&mut self) {
306 self.curr_name = None;
307 self.curr = Some(VecTree::new());
308 self.curr_nt = None;
309 }
310
311 fn exit_rule(&mut self, ctx: CtxRule) -> SynRule {
312 let (var, id) = match ctx {
313 CtxRule::V1 { rule_nt: SynRuleNt(var), rts_expr: SynRtsExpr(id_expr) }
315 | CtxRule::V2 { rule_nt: SynRuleNt(var), prs_expr: SynPrsExpr(id_expr) } => (var, id_expr),
317 };
318 let mut tree = self.curr.take().unwrap();
319 tree.set_root(id);
320 self.rules[var as usize] = tree;
321 SynRule()
322 }
323
324 fn exit_rule_nt(&mut self, ctx: CtxRuleNt) -> SynRuleNt {
325 let CtxRuleNt::V1 { nonterminal } = ctx;
326 let mut error = false;
327 assert_eq!(self.curr_nt, None);
328 let var = if let Some(&var) = self.nt.get(&nonterminal) {
329 if !self.rules[var as usize].is_empty() {
330 error = true;
331 self.log.add_error(format!("nonterminal '{nonterminal}' is defined multiple times"));
332 }
333 var
334 } else {
335 let var = self.get_or_create_nt(nonterminal.clone());
336 var
337 };
338 if !error { self.nt_def_order.push(var); }
339 self.curr_nt = Some(var);
340 self.curr_name = Some(nonterminal);
341 SynRuleNt(var)
342 }
343
344 fn exit_rts_expr(&mut self, ctx: CtxRtsExpr) -> SynRtsExpr {
345 let tree = self.curr.as_mut().unwrap();
346 let id = match ctx {
347 CtxRtsExpr::V1 { rts_children: SynRtsChildren(v) } =>
349 tree.addci_iter(None, GrNode::Concat, v.into_iter().map(|SynRtsExpr(id)| id)),
350 CtxRtsExpr::V2 { rts_children: SynRtsChildren(v) } =>
352 tree.addci_iter(None, GrNode::Or, v.into_iter().map(|SynRtsExpr(id)| id)),
353 CtxRtsExpr::V3 { rts_children: SynRtsChildren(v) } =>
355 tree.addci_iter(None, GrNode::Plus, v.into_iter().map(|SynRtsExpr(id)| id)),
356 CtxRtsExpr::V4 { rts_children: SynRtsChildren(v) } =>
358 tree.addci_iter(None, GrNode::Star, v.into_iter().map(|SynRtsExpr(id)| id)),
359 CtxRtsExpr::V5 { rts_children: SynRtsChildren(v) } =>
361 tree.addci_iter(None, GrNode::Maybe, v.into_iter().map(|SynRtsExpr(id)| id)),
362 CtxRtsExpr::V6 { item: SynItem(id_item) } =>
364 id_item,
365 };
366 SynRtsExpr(id)
367 }
368
369 fn exit_rts_children(&mut self, ctx: CtxRtsChildren) -> SynRtsChildren {
370 let CtxRtsChildren::V1 { star: SynRtsChildren1(v) } = ctx;
372 SynRtsChildren(v)
373 }
374
375 fn exit_prs_expr(&mut self, ctx: CtxPrsExpr) -> SynPrsExpr {
376 let tree = self.curr.as_mut().unwrap();
377 let id = match ctx {
378 CtxPrsExpr::V1 { prs_expr: SynPrsExpr(id) } =>
380 tree.addci(None, GrNode::Plus, id),
381 CtxPrsExpr::V2 { prs_expr: SynPrsExpr(id) } =>
383 tree.addci(None, GrNode::Star, id),
384 CtxPrsExpr::V3 { prs_expr: SynPrsExpr(id) } =>
386 tree.addci(None, GrNode::Maybe, id),
387 CtxPrsExpr::V4 { prs_expr: [SynPrsExpr(mut left), SynPrsExpr(right)] } => {
389 if *tree.get(left) != GrNode::Concat {
390 left = tree.addci(None, GrNode::Concat, left);
391 }
392 tree.attach_child(left, right);
393 left
394 }
395 CtxPrsExpr::V5 { prs_expr: [SynPrsExpr(mut left), SynPrsExpr(right)] } => {
397 if *tree.get(left) != GrNode::Or {
398 left = tree.addci(None, GrNode::Or, left);
399 }
400 tree.attach_child(left, right);
401 left
402 }
403 CtxPrsExpr::V6 { prs_expr: SynPrsExpr(id) } => id,
405 CtxPrsExpr::V7 { item: SynItem(id) } => id,
407 };
408 SynPrsExpr(id)
409 }
410
411 fn exit_item(&mut self, ctx: CtxItem) -> SynItem {
412 let id = match ctx {
413 CtxItem::V1 { nonterminal } => {
415 let var = self.get_or_create_nt(nonterminal);
416 self.curr.as_mut().unwrap().add(None, GrNode::Symbol(Symbol::NT(var)))
417 }
418 CtxItem::V2 { ntx } => {
420 let x = match VarId::from_str(&ntx[3..ntx.len() - 1]) {
421 Ok(x) => x,
422 Err(e) => {
423 self.log.add_error(format!("in {}, integer literal {ntx} can't be parsed: {e}", self.curr_name.as_ref().unwrap()));
424 VarId::MAX
425 }
426 };
427 self.curr.as_mut().unwrap().add(None, GrNode::Symbol(Symbol::NT(x)))
428 }
429 CtxItem::V3 { terminal } => {
431 let (is_new, tok) = self.get_or_create_t(terminal.clone());
432 if let IsNew::Yes = is_new {
433 self.tokens.push((terminal, None));
434 }
435 self.curr.as_mut().unwrap().add(None, GrNode::Symbol(Symbol::T(tok)))
436 }
437 CtxItem::V4 { terminalcst } => {
439 let (is_new, tok) = self.get_or_create_t(terminalcst.clone());
440 if let IsNew::Yes = is_new {
441 match decode_str(&terminalcst[1..terminalcst.len() - 1]) {
443 Ok(text) => {
444 self.tokens.push((String::new(), Some(text)));
445 }
446 Err(msg) => {
447 self.log.add_error(format!("in {}, string literal {terminalcst}: {msg}", self.curr_name.as_ref().unwrap()));
448 self.tokens.push((String::new(), Some("???".to_string())));
449 }
450 }
451 }
452 self.curr.as_mut().unwrap().add(None, GrNode::Symbol(Symbol::T(tok)))
453 }
454 CtxItem::V5 { tx } => {
456 let x = match VarId::from_str(&tx[2..tx.len() - 1]) {
457 Ok(x) => x,
458 Err(e) => {
459 self.log.add_error(format!("in {}, integer literal {tx} can't be parsed: {e}", self.curr_name.as_ref().unwrap()));
460 VarId::MAX
461 }
462 };
463 self.curr.as_mut().unwrap().add(None, GrNode::Symbol(Symbol::T(x)))
464 }
465 CtxItem::V6 { .. } =>
467 self.curr.as_mut().unwrap().add(None, GrNode::Symbol(Symbol::Empty)),
468 CtxItem::V7 { ltag } => {
470 let var = if ltag.len() > 3 {
472 let name = <ag[3..ltag.len()-1];
473 let var = self.get_or_create_nt(name.to_string());
474 self.nt_def_order.push(var);
475 self.rules[var as usize].add_root(GrNode::Symbol(Symbol::Empty));
476 self.reserved_nt.push(var);
477 var
478 } else {
479 self.curr_nt.unwrap()
480 };
481 self.curr.as_mut().unwrap().add(None, GrNode::LForm(var))
482 }
483 CtxItem::V8 => self.curr.as_mut().unwrap().add(None, GrNode::PrecEq),
485 CtxItem::V9 => self.curr.as_mut().unwrap().add(None, GrNode::RAssoc),
487 };
488 SynItem(id)
489 }
490}
491
492fn decode_str(strlit: &str) -> Result<String, String> {
494 let mut result = String::new();
495 let mut chars = strlit.chars();
496 while let Some(c) = chars.next() {
497 match c {
498 '\\' => {
499 result.push(match chars.next().ok_or(format!("'\\' incomplete escape code in string literal '{strlit}'"))? {
500 'n' => '\n',
501 'r' => '\r',
502 't' => '\t',
503 '\"' => '\"',
504 '\\' => '\\',
505 'u' => {
506 if !matches!(chars.next(), Some('{')) { return Err(format!("malformed unicode literal in string literal '{strlit}' (missing '{{')")); }
507 let mut hex = String::new();
508 loop {
509 let Some(h) = chars.next() else { return Err(format!("malformed unicode literal in string literal '{strlit}' (missing '}}')")); };
510 if h == '}' { break; }
511 hex.push(h);
512 };
513 let code = u32::from_str_radix(&hex, 16).map_err(|_| format!("'{hex}' isn't a valid hexadecimal value"))?;
514 char::from_u32(code).ok_or_else(|| format!("'{hex}' isn't a valid unicode hexadecimal value"))?
515 }
516 unknown => return Err(format!("unknown escape code '\\{unknown}' in string literal '{strlit}'"))
517 });
518 }
519 _ => result.push(c)
520 }
521 }
522 Ok(result)
523}
524
525pub mod listener_types {
530 use crate::VarId;
531
532 #[derive(Debug, PartialEq)] pub struct SynFile();
534 #[derive(Debug, PartialEq)] pub struct SynDecls();
536 #[derive(Debug, PartialEq)] pub struct SynDecl();
538 #[derive(Debug, PartialEq)] pub struct SynDeclTerminal();
540 #[derive(Debug, PartialEq)] pub struct SynRuleset();
542 #[derive(Debug, PartialEq)] pub struct SynRule();
544 #[derive(Debug, PartialEq)] pub struct SynRuleNt(pub VarId);
546 #[derive(Debug, PartialEq)] pub struct SynRtsExpr(pub usize);
548 #[derive(Debug, PartialEq)] pub struct SynRtsChildren(pub Vec<SynRtsExpr>);
550 #[derive(Debug, PartialEq)] pub struct SynPrsExpr(pub usize);
552 #[derive(Debug, PartialEq)] pub struct SynItem(pub usize);
554}
555
556pub mod rtsgen_lexer {
559 use crate as lexigram_lib;
561
562 use std::collections::HashMap;
565 use std::io::Read;
566 use lexigram_lib::lexer::{ActionOption, Lexer, ModeOption, StateId, Terminal};
567 use lexigram_lib::segmap::{GroupId, Seg, SegMap};
568
569 const NBR_GROUPS: u32 = 42;
570 const INITIAL_STATE: StateId = 0;
571 const FIRST_END_STATE: StateId = 22;
572 const NBR_STATES: StateId = 54;
573 static ASCII_TO_GROUP: [GroupId; 128] = [
574 30, 30, 30, 30, 30, 30, 30, 30, 30, 22, 38, 30, 30, 38, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 30, 1, 30, 30, 30, 2, 30, 3, 4, 5, 6, 7, 8, 30, 9, 36, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 10, 11, 12, 23, 13, 30, 28, 28, 28, 28, 28, 28, 33, 33, 33, 33, 33, 14, 33, 15, 33, 26, 33, 27, 33, 16, 33, 33, 33, 33, 33, 33, 30, 24, 30, 30, 34, 30, 32, 32, 32, 32, 40, 32, 35, 35, 35, 35, 39, 35, 35, 41, 37, 35, 35, 17, 35, 18, 31, 35, 35, 35, 35, 35, 19, 20, 25, 30, 30, ];
583 static UTF8_TO_GROUP: [(char, GroupId); 2] = [
584 ('ε', 21),
585 ('€', 21),
586 ];
587 static SEG_TO_GROUP: [(Seg, GroupId); 4] = [
588 (Seg(128, 948), 30),
589 (Seg(950, 8363), 30),
590 (Seg(8365, 55295), 30),
591 (Seg(57344, 1114111), 30),
592 ];
593 static TERMINAL_TABLE: [Terminal;32] = [
594 Terminal { action: ActionOption::Skip, channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
595 Terminal { action: ActionOption::Token(2), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
596 Terminal { action: ActionOption::Token(10), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
597 Terminal { action: ActionOption::Token(11), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
598 Terminal { action: ActionOption::Token(5), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
599 Terminal { action: ActionOption::Token(4), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
600 Terminal { action: ActionOption::Token(9), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
601 Terminal { action: ActionOption::Token(12), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
602 Terminal { action: ActionOption::Token(8), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
603 Terminal { action: ActionOption::Token(6), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
604 Terminal { action: ActionOption::Token(18), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
605 Terminal { action: ActionOption::Token(18), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
606 Terminal { action: ActionOption::Token(18), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
607 Terminal { action: ActionOption::Token(19), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
608 Terminal { action: ActionOption::Token(19), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
609 Terminal { action: ActionOption::Token(3), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
610 Terminal { action: ActionOption::Token(7), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
611 Terminal { action: ActionOption::Skip, channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
612 Terminal { action: ActionOption::Skip, channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
613 Terminal { action: ActionOption::Token(0), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
614 Terminal { action: ActionOption::Token(1), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
615 Terminal { action: ActionOption::Token(13), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
616 Terminal { action: ActionOption::Token(14), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
617 Terminal { action: ActionOption::Token(15), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
618 Terminal { action: ActionOption::Token(19), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
619 Terminal { action: ActionOption::Token(19), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
620 Terminal { action: ActionOption::Token(19), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
621 Terminal { action: ActionOption::Token(16), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
622 Terminal { action: ActionOption::Token(17), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
623 Terminal { action: ActionOption::Token(18), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
624 Terminal { action: ActionOption::Token(20), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
625 Terminal { action: ActionOption::Token(21), channel: 0, mode: ModeOption::None, mode_state: None, pop: false },
626 ];
627 static STATE_TABLE: [StateId; 2269] = [
628 22, 1, 23, 24, 25, 26, 27, 28, 2, 3, 29, 4, 30, 31, 32, 33, 34, 35, 36, 5, 37, 38, 22, 54, 54, 54, 32, 32, 32, 54, 54, 35, 35, 32, 54, 35, 54, 35, 22, 35, 35, 35, 13, 54, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 13, 13, 13, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 41, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 6, 54, 54, 54, 39, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 8, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 9, 10, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 38, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 40, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 11, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 43, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 44, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 45, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 12, 12, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 12, 12, 54, 54, 12, 54, 12, 54, 12, 12, 12, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 12, 12, 54, 54, 54, 54, 43, 54, 54, 54, 54, 54, 12, 54, 12, 12, 54, 12, 12, 12, 12, 54, 12, 12, 12, 13, 50, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 13, 13, 13, 54, 13, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 13, 13, 54, 54, 54, 54, 54, 13, 54, 54, 54, 54, 54, 54, 15, 54, 54, 54, 54, 54, 54, 54, 54, 54, 13, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 16, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 17, 17, 54, 54, 17, 54, 54, 54, 17, 54, 54, 54, 17, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 13, 54, 54, 17, 17, 54, 54, 17, 54, 54, 54, 17, 54, 54, 54, 17, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 19, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 52, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 19, 54, 54, 54, 54, 54, 54, 19, 54, 54, 54, 54, 54, 54, 54, 54, 54, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 20, 54, 54, 54, 54, 54, 54, 20, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 20, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 22, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 22, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 22, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 42, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 32, 32, 32, 32, 32, 54, 54, 54, 54, 54, 54, 54, 32, 32, 32, 32, 54, 32, 32, 32, 32, 32, 32, 32, 54, 32, 32, 32, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 32, 32, 51, 32, 32, 54, 54, 54, 54, 54, 54, 54, 32, 32, 32, 32, 54, 32, 32, 32, 32, 32, 32, 32, 54, 32, 32, 32, 54, 54, 54, 18, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 32, 32, 32, 32, 32, 54, 54, 54, 54, 54, 54, 54, 32, 32, 32, 32, 54, 32, 32, 32, 32, 32, 32, 32, 54, 32, 32, 32, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 35, 35, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 35, 54, 35, 35, 54, 35, 35, 35, 35, 54, 35, 35, 35, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 35, 35, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 35, 54, 35, 35, 54, 35, 35, 35, 46, 54, 35, 35, 35, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 54, 39, 39, 39, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 35, 35, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 35, 54, 35, 35, 54, 35, 35, 35, 35, 54, 47, 35, 35, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 35, 35, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 35, 54, 35, 35, 54, 35, 35, 35, 35, 54, 35, 48, 35, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 35, 35, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 35, 54, 35, 35, 54, 35, 35, 35, 35, 54, 35, 35, 49, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 35, 35, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 35, 54, 35, 35, 54, 35, 35, 35, 35, 54, 35, 35, 35, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 21, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 32, 32, 32, 32, 32, 54, 54, 54, 54, 54, 54, 54, 32, 32, 32, 32, 54, 32, 32, 32, 32, 32, 32, 32, 54, 32, 32, 32, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54 ];
684
685 pub fn build_lexer<R: Read>() -> Lexer<'static, R> {
686 Lexer::new(
687 NBR_GROUPS,
689 INITIAL_STATE,
690 FIRST_END_STATE,
691 NBR_STATES,
692 &ASCII_TO_GROUP,
694 HashMap::<char, GroupId>::from(UTF8_TO_GROUP),
695 SegMap::<GroupId>::from(SEG_TO_GROUP),
696 &STATE_TABLE,
697 &TERMINAL_TABLE,
698 )
699 }
700
701 }
703
704pub mod rtsgen_parser {
707 use crate as lexigram_lib;
709
710 use lexigram_lib::{AltId, VarId, fixed_sym_table::FixedSymTable, log::Logger, parser::{Call, ListenerWrapper, OpCode, Parser}};
713 use super::listener_types::*;
714
715 const PARSER_NUM_T: usize = 22;
716 const PARSER_NUM_NT: usize = 23;
717 static SYMBOLS_T: [(&str, Option<&str>); PARSER_NUM_T] = [("Arrow", Some("->")), ("DArrow", Some("=>")), ("Concat", Some("&")), ("Or", Some("|")), ("Plus", Some("+")), ("Star", Some("*")), ("Question", Some("?")), ("Empty", None), ("Equal", Some("=")), ("Comma", Some(",")), ("LPar", Some("(")), ("RPar", Some(")")), ("Semicolon", Some(";")), ("LTag", None), ("PTag", Some("<P>")), ("RTag", Some("<R>")), ("Token", Some("token")), ("TerminalCst", None), ("Terminal", None), ("Nonterminal", None), ("Tx", None), ("NTx", None)];
718 static SYMBOLS_NT: [&str; PARSER_NUM_NT] = ["file", "decls", "decl_iter", "decl", "decl_terminal", "ruleset", "rule_iter", "rule", "rule_nt", "rts_expr", "rts_children", "prs_expr", "item", "decl_1", "rts_children_1", "prs_expr_1", "prs_expr_2", "prs_expr_3", "prs_expr_4", "prs_expr_5", "prs_expr_6", "decl_terminal_1", "rule_1"];
719 static ALT_VAR: [VarId; 55] = [0, 1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9, 9, 9, 9, 9, 9, 10, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 16, 17, 17, 17, 17, 17, 18, 19, 19, 19, 19, 20, 20, 21, 21, 22, 22];
720 static PARSING_TABLE: [AltId; 529] = [55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 1, 55, 55, 1, 55, 55, 1, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 2, 55, 55, 3, 55, 55, 3, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 4, 55, 55, 56, 55, 55, 56, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 55, 55, 56, 55, 55, 55, 55, 55, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 55, 55, 6, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 7, 55, 55, 8, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 9, 55, 55, 56, 56, 56, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 10, 55, 55, 55, 55, 55, 11, 12, 13, 14, 15, 16, 55, 55, 55, 56, 56, 16, 16, 16, 55, 16, 16, 16, 16, 16, 55, 55, 55, 56, 56, 56, 56, 56, 56, 55, 55, 17, 56, 56, 56, 56, 56, 55, 56, 56, 56, 56, 56, 55, 55, 55, 55, 55, 55, 55, 55, 18, 55, 55, 18, 56, 56, 18, 18, 18, 55, 18, 18, 18, 18, 18, 55, 55, 55, 56, 56, 56, 56, 56, 24, 55, 55, 56, 56, 56, 25, 26, 27, 55, 22, 21, 19, 23, 20, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 28, 55, 55, 29, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 30, 30, 30, 30, 30, 30, 55, 55, 55, 31, 55, 30, 30, 30, 55, 30, 30, 30, 30, 30, 55, 55, 55, 55, 36, 32, 33, 34, 35, 55, 55, 35, 37, 37, 35, 35, 35, 55, 35, 35, 35, 35, 35, 55, 55, 55, 55, 56, 56, 56, 56, 38, 55, 55, 38, 56, 56, 38, 38, 38, 55, 38, 38, 38, 38, 38, 55, 55, 55, 55, 43, 39, 40, 41, 42, 55, 55, 42, 43, 43, 42, 42, 42, 55, 42, 42, 42, 42, 42, 55, 55, 55, 55, 56, 56, 56, 56, 44, 55, 55, 44, 56, 56, 44, 44, 44, 55, 44, 44, 44, 44, 44, 55, 55, 55, 55, 48, 45, 46, 47, 48, 55, 55, 48, 48, 48, 48, 48, 48, 55, 48, 48, 48, 48, 48, 55, 55, 55, 55, 56, 56, 56, 56, 50, 55, 55, 49, 56, 56, 50, 50, 50, 55, 50, 50, 50, 50, 50, 55, 55, 55, 55, 55, 55, 55, 55, 55, 51, 52, 55, 55, 52, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 53, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 55, 55, 56];
721 static OPCODES: [&[OpCode]; 55] = [&[OpCode::Exit(0), OpCode::NT(5), OpCode::NT(1)], &[OpCode::Exit(1), OpCode::NT(2)], &[OpCode::Loop(2), OpCode::Exit(2), OpCode::NT(3)], &[OpCode::Exit(3)], &[OpCode::Exit(4), OpCode::T(12), OpCode::NT(13), OpCode::NT(4), OpCode::T(16)], &[OpCode::NT(21), OpCode::T(18)], &[OpCode::Exit(6), OpCode::NT(6)], &[OpCode::Loop(6), OpCode::Exit(7), OpCode::NT(7)], &[OpCode::Exit(8)], &[OpCode::NT(22), OpCode::NT(8)], &[OpCode::Exit(10), OpCode::T(19)], &[OpCode::Exit(11), OpCode::NT(10), OpCode::T(2)], &[OpCode::Exit(12), OpCode::NT(10), OpCode::T(3)], &[OpCode::Exit(13), OpCode::NT(10), OpCode::T(4)], &[OpCode::Exit(14), OpCode::NT(10), OpCode::T(5)], &[OpCode::Exit(15), OpCode::NT(10), OpCode::T(6)], &[OpCode::Exit(16), OpCode::NT(12)], &[OpCode::Exit(17), OpCode::T(11), OpCode::NT(14), OpCode::T(10)], &[OpCode::NT(15), OpCode::Exit(18), OpCode::NT(20)], &[OpCode::Exit(19), OpCode::T(19)], &[OpCode::Exit(20), OpCode::T(21)], &[OpCode::Exit(21), OpCode::T(18)], &[OpCode::Exit(22), OpCode::T(17)], &[OpCode::Exit(23), OpCode::T(20)], &[OpCode::Exit(24), OpCode::T(7)], &[OpCode::Exit(25), OpCode::T(13)], &[OpCode::Exit(26), OpCode::T(14)], &[OpCode::Exit(27), OpCode::T(15)], &[OpCode::Loop(13), OpCode::Exit(28), OpCode::NT(4), OpCode::T(9)], &[OpCode::Exit(29)], &[OpCode::Loop(14), OpCode::Exit(30), OpCode::NT(9)], &[OpCode::Exit(31)], &[OpCode::Loop(15), OpCode::Exit(32), OpCode::T(4)], &[OpCode::Loop(15), OpCode::Exit(33), OpCode::T(5)], &[OpCode::Loop(15), OpCode::Exit(34), OpCode::T(6)], &[OpCode::Loop(15), OpCode::Exit(35), OpCode::NT(18)], &[OpCode::Loop(15), OpCode::Exit(36), OpCode::NT(16), OpCode::T(3)], &[OpCode::Exit(37)], &[OpCode::NT(17), OpCode::Exit(38), OpCode::NT(20)], &[OpCode::Loop(17), OpCode::Exit(39), OpCode::T(4)], &[OpCode::Loop(17), OpCode::Exit(40), OpCode::T(5)], &[OpCode::Loop(17), OpCode::Exit(41), OpCode::T(6)], &[OpCode::Loop(17), OpCode::Exit(42), OpCode::NT(18)], &[OpCode::Exit(43)], &[OpCode::NT(19), OpCode::Exit(44), OpCode::NT(20)], &[OpCode::Loop(19), OpCode::Exit(45), OpCode::T(4)], &[OpCode::Loop(19), OpCode::Exit(46), OpCode::T(5)], &[OpCode::Loop(19), OpCode::Exit(47), OpCode::T(6)], &[OpCode::Exit(48)], &[OpCode::Exit(49), OpCode::T(11), OpCode::NT(11), OpCode::T(10)], &[OpCode::Exit(50), OpCode::NT(12)], &[OpCode::Exit(51), OpCode::T(17), OpCode::T(8)], &[OpCode::Exit(52)], &[OpCode::Exit(53), OpCode::T(12), OpCode::NT(11), OpCode::T(0)], &[OpCode::Exit(54), OpCode::T(12), OpCode::NT(9), OpCode::T(1)]];
722 static START_SYMBOL: VarId = 0;
723
724 pub fn build_parser() -> Parser<'static> {
725 let symbol_table = FixedSymTable::new(
726 SYMBOLS_T.into_iter().map(|(s, os)| (s.to_string(), os.map(|s| s.to_string()))).collect(),
727 SYMBOLS_NT.into_iter().map(|s| s.to_string()).collect()
728 );
729 Parser::new(
730 PARSER_NUM_NT, PARSER_NUM_T + 1,
731 &ALT_VAR,
732 Vec::new(),
733 OPCODES.into_iter().map(|strip| strip.to_vec()).collect(),
734 &PARSING_TABLE,
735 symbol_table,
736 START_SYMBOL
737 )
738 }
739
740 #[derive(Debug)]
741 pub enum CtxFile {
742 V1 { decls: SynDecls, ruleset: SynRuleset },
744 }
745 #[derive(Debug)]
746 pub enum CtxDecls {
747 V1,
749 }
750 #[derive(Debug)]
751 pub enum CtxDeclIter {
752 V1 { decl: SynDecl },
754 }
755 #[derive(Debug)]
756 pub enum CtxDecl {
757 V1 { decl_terminal: SynDeclTerminal, star: SynDecl1 },
759 }
760 #[derive(Debug)]
761 pub enum CtxDeclTerminal {
762 V1 { terminal: String, terminalcst: String },
764 V2 { terminal: String },
766 }
767 #[derive(Debug)]
768 pub enum CtxRuleset {
769 V1,
771 }
772 #[derive(Debug)]
773 pub enum CtxRuleIter {
774 V1 { rule: SynRule },
776 }
777 #[derive(Debug)]
778 pub enum CtxRule {
779 V1 { rule_nt: SynRuleNt, rts_expr: SynRtsExpr },
781 V2 { rule_nt: SynRuleNt, prs_expr: SynPrsExpr },
783 }
784 #[derive(Debug)]
785 pub enum CtxRuleNt {
786 V1 { nonterminal: String },
788 }
789 #[derive(Debug)]
790 pub enum CtxRtsExpr {
791 V1 { rts_children: SynRtsChildren },
793 V2 { rts_children: SynRtsChildren },
795 V3 { rts_children: SynRtsChildren },
797 V4 { rts_children: SynRtsChildren },
799 V5 { rts_children: SynRtsChildren },
801 V6 { item: SynItem },
803 }
804 #[derive(Debug)]
805 pub enum CtxRtsChildren {
806 V1 { star: SynRtsChildren1 },
808 }
809 #[derive(Debug)]
810 pub enum CtxPrsExpr {
811 V1 { prs_expr: SynPrsExpr },
813 V2 { prs_expr: SynPrsExpr },
815 V3 { prs_expr: SynPrsExpr },
817 V4 { prs_expr: [SynPrsExpr; 2] },
819 V5 { prs_expr: [SynPrsExpr; 2] },
821 V6 { prs_expr: SynPrsExpr },
823 V7 { item: SynItem },
825 }
826 #[derive(Debug)]
827 pub enum CtxItem {
828 V1 { nonterminal: String },
830 V2 { ntx: String },
832 V3 { terminal: String },
834 V4 { terminalcst: String },
836 V5 { tx: String },
838 V6 { empty: String },
840 V7 { ltag: String },
842 V8,
844 V9,
846 }
847
848 #[derive(Debug, PartialEq)]
874 pub struct SynDecl1(pub Vec<SynDeclTerminal>);
875 #[derive(Debug, PartialEq)]
877 pub struct SynRtsChildren1(pub Vec<SynRtsExpr>);
878
879 #[derive(Debug)]
880 enum SynValue { File(SynFile), Decls(SynDecls), Decl(SynDecl), DeclTerminal(SynDeclTerminal), Ruleset(SynRuleset), Rule(SynRule), RuleNt(SynRuleNt), RtsExpr(SynRtsExpr), RtsChildren(SynRtsChildren), PrsExpr(SynPrsExpr), Item(SynItem), Decl1(SynDecl1), RtsChildren1(SynRtsChildren1) }
881
882 impl SynValue {
883 fn get_file(self) -> SynFile {
884 if let SynValue::File(val) = self { val } else { panic!() }
885 }
886 fn get_decls(self) -> SynDecls {
887 if let SynValue::Decls(val) = self { val } else { panic!() }
888 }
889 fn get_decl(self) -> SynDecl {
890 if let SynValue::Decl(val) = self { val } else { panic!() }
891 }
892 fn get_decl_terminal(self) -> SynDeclTerminal {
893 if let SynValue::DeclTerminal(val) = self { val } else { panic!() }
894 }
895 fn get_ruleset(self) -> SynRuleset {
896 if let SynValue::Ruleset(val) = self { val } else { panic!() }
897 }
898 fn get_rule(self) -> SynRule {
899 if let SynValue::Rule(val) = self { val } else { panic!() }
900 }
901 fn get_rule_nt(self) -> SynRuleNt {
902 if let SynValue::RuleNt(val) = self { val } else { panic!() }
903 }
904 fn get_rts_expr(self) -> SynRtsExpr {
905 if let SynValue::RtsExpr(val) = self { val } else { panic!() }
906 }
907 fn get_rts_children(self) -> SynRtsChildren {
908 if let SynValue::RtsChildren(val) = self { val } else { panic!() }
909 }
910 fn get_prs_expr(self) -> SynPrsExpr {
911 if let SynValue::PrsExpr(val) = self { val } else { panic!() }
912 }
913 fn get_item(self) -> SynItem {
914 if let SynValue::Item(val) = self { val } else { panic!() }
915 }
916 fn get_decl1(self) -> SynDecl1 {
917 if let SynValue::Decl1(val) = self { val } else { panic!() }
918 }
919 fn get_rts_children1(self) -> SynRtsChildren1 {
920 if let SynValue::RtsChildren1(val) = self { val } else { panic!() }
921 }
922 }
923
924 pub trait RtsGenListener {
925 fn check_abort_request(&self) -> bool { false }
928 fn get_mut_log(&mut self) -> &mut impl Logger;
929 #[allow(unused)]
930 fn exit(&mut self, file: SynFile) {}
931 fn init_file(&mut self) {}
932 fn exit_file(&mut self, ctx: CtxFile) -> SynFile;
933 fn init_decls(&mut self) {}
934 fn exit_decls(&mut self, ctx: CtxDecls) -> SynDecls;
935 fn init_decl_iter(&mut self) {}
936 #[allow(unused)]
937 fn exit_decl_iter(&mut self, ctx: CtxDeclIter) {}
938 fn init_decl(&mut self) {}
939 fn exit_decl(&mut self, ctx: CtxDecl) -> SynDecl;
940 fn init_decl_terminal(&mut self) {}
941 fn exit_decl_terminal(&mut self, ctx: CtxDeclTerminal) -> SynDeclTerminal;
942 fn init_ruleset(&mut self) {}
943 fn exit_ruleset(&mut self, ctx: CtxRuleset) -> SynRuleset;
944 fn init_rule_iter(&mut self) {}
945 #[allow(unused)]
946 fn exit_rule_iter(&mut self, ctx: CtxRuleIter) {}
947 fn init_rule(&mut self) {}
948 fn exit_rule(&mut self, ctx: CtxRule) -> SynRule;
949 fn init_rule_nt(&mut self) {}
950 fn exit_rule_nt(&mut self, ctx: CtxRuleNt) -> SynRuleNt;
951 fn init_rts_expr(&mut self) {}
952 fn exit_rts_expr(&mut self, ctx: CtxRtsExpr) -> SynRtsExpr;
953 fn init_rts_children(&mut self) {}
954 fn exit_rts_children(&mut self, ctx: CtxRtsChildren) -> SynRtsChildren;
955 fn init_prs_expr(&mut self) {}
956 fn exit_prs_expr(&mut self, ctx: CtxPrsExpr) -> SynPrsExpr;
957 fn init_item(&mut self) {}
958 fn exit_item(&mut self, ctx: CtxItem) -> SynItem;
959 }
960
961 pub struct Wrapper<T> {
962 verbose: bool,
963 listener: T,
964 stack: Vec<SynValue>,
965 max_stack: usize,
966 stack_t: Vec<String>,
967 }
968
969 impl<T: RtsGenListener> ListenerWrapper for Wrapper<T> {
970 fn switch(&mut self, call: Call, nt: VarId, alt_id: AltId, t_data: Option<Vec<String>>) {
971 if self.verbose {
972 println!("switch: call={call:?}, nt={nt}, alt={alt_id}, t_data={t_data:?}");
973 }
974 if let Some(mut t_data) = t_data {
975 self.stack_t.append(&mut t_data);
976 }
977 match call {
978 Call::Enter => {
979 match nt {
980 0 => self.listener.init_file(), 1 => self.listener.init_decls(), 2 => self.listener.init_decl_iter(), 3 => self.listener.init_decl(), 13 => self.init_decl1(), 4 => self.listener.init_decl_terminal(), 21 => {} 5 => self.listener.init_ruleset(), 6 => self.listener.init_rule_iter(), 7 => self.listener.init_rule(), 22 => {} 8 => self.listener.init_rule_nt(), 9 => self.listener.init_rts_expr(), 10 => self.listener.init_rts_children(), 14 => self.init_rts_children1(), 11 => self.listener.init_prs_expr(), 15 ..= 20 => {} 12 => self.listener.init_item(), _ => panic!("unexpected enter nonterminal id: {nt}")
999 }
1000 }
1001 Call::Loop => {}
1002 Call::Exit => {
1003 match alt_id {
1004 0 => self.exit_file(), 1 => self.exit_decls(), 2 => self.exit_decl_iter(), 3 => {} 4 => self.exit_decl(), 28 => self.exit_decl1(), 29 => {} 51 | 52 => self.exit_decl_terminal(alt_id), 6 => self.exit_ruleset(), 7 => self.exit_rule_iter(), 8 => {} 53 | 54 => self.exit_rule(alt_id), 10 => self.exit_rule_nt(), 11 | 12 | 13 | 14 | 15 | 16 => self.exit_rts_expr(alt_id), 17 => self.exit_rts_children(), 30 => self.exit_rts_children1(), 31 => {} 32 | 33 | 34 | 35 | 36 => self.exit_prs_expr1(alt_id), 39 | 45 => self.exit_prs_expr1(32), 40 | 46 => self.exit_prs_expr1(33), 41 | 47 => self.exit_prs_expr1(34), 42 => self.exit_prs_expr1(35), 49 | 50 => self.exit_prs_expr6(alt_id), 18 => {} 37 => {} 38 => {} 43 => {} 44 => {} 48 => {} 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 => self.exit_item(alt_id), _ => panic!("unexpected exit alternative id: {alt_id}")
1060 }
1061 }
1062 Call::End => {
1063 self.exit();
1064 }
1065 }
1066 self.max_stack = std::cmp::max(self.max_stack, self.stack.len());
1067 if self.verbose {
1068 println!("> stack_t: {}", self.stack_t.join(", "));
1069 println!("> stack: {}", self.stack.iter().map(|it| format!("{it:?}")).collect::<Vec<_>>().join(", "));
1070 }
1071 }
1072
1073 fn check_abort_request(&self) -> bool {
1074 self.listener.check_abort_request()
1075 }
1076
1077 fn get_mut_log(&mut self) -> &mut impl Logger {
1078 self.listener.get_mut_log()
1079 }
1080
1081 fn is_stack_empty(&self) -> bool {
1082 self.stack.is_empty()
1083 }
1084
1085 fn is_stack_t_empty(&self) -> bool {
1086 self.stack_t.is_empty()
1087 }
1088 }
1089
1090 impl<T: RtsGenListener> Wrapper<T> {
1091 pub fn new(listener: T, verbose: bool) -> Self {
1092 Wrapper { verbose, listener, stack: Vec::new(), max_stack: 0, stack_t: Vec::new() }
1093 }
1094
1095 pub fn get_listener(&self) -> &T {
1096 &self.listener
1097 }
1098
1099 pub fn get_listener_mut(&mut self) -> &mut T {
1100 &mut self.listener
1101 }
1102
1103 pub fn give_listener(self) -> T {
1104 self.listener
1105 }
1106
1107 pub fn set_verbose(&mut self, verbose: bool) {
1108 self.verbose = verbose;
1109 }
1110
1111 fn exit(&mut self) {
1112 let file = self.stack.pop().unwrap().get_file();
1113 self.listener.exit(file);
1114 }
1115
1116 fn exit_file(&mut self) {
1117 let ruleset = self.stack.pop().unwrap().get_ruleset();
1118 let decls = self.stack.pop().unwrap().get_decls();
1119 let ctx = CtxFile::V1 { decls, ruleset };
1120 let val = self.listener.exit_file(ctx);
1121 self.stack.push(SynValue::File(val));
1122 }
1123
1124 fn exit_decls(&mut self) {
1125 let ctx = CtxDecls::V1;
1126 let val = self.listener.exit_decls(ctx);
1127 self.stack.push(SynValue::Decls(val));
1128 }
1129
1130 fn exit_decl_iter(&mut self) {
1131 let decl = self.stack.pop().unwrap().get_decl();
1132 let ctx = CtxDeclIter::V1 { decl };
1133 self.listener.exit_decl_iter(ctx);
1134 }
1135
1136 fn exit_decl(&mut self) {
1137 let star = self.stack.pop().unwrap().get_decl1();
1138 let decl_terminal = self.stack.pop().unwrap().get_decl_terminal();
1139 let ctx = CtxDecl::V1 { decl_terminal, star };
1140 let val = self.listener.exit_decl(ctx);
1141 self.stack.push(SynValue::Decl(val));
1142 }
1143
1144 fn init_decl1(&mut self) {
1145 let val = SynDecl1(Vec::new());
1146 self.stack.push(SynValue::Decl1(val));
1147 }
1148
1149 fn exit_decl1(&mut self) {
1150 let decl_terminal = self.stack.pop().unwrap().get_decl_terminal();
1151 let Some(SynValue::Decl1(SynDecl1(star_acc))) = self.stack.last_mut() else {
1152 panic!("unexpected SynDecl1 item on wrapper stack");
1153 };
1154 star_acc.push(decl_terminal);
1155 }
1156
1157 fn exit_decl_terminal(&mut self, alt_id: AltId) {
1158 let ctx = match alt_id {
1159 51 => {
1160 let terminalcst = self.stack_t.pop().unwrap();
1161 let terminal = self.stack_t.pop().unwrap();
1162 CtxDeclTerminal::V1 { terminal, terminalcst }
1163 }
1164 52 => {
1165 let terminal = self.stack_t.pop().unwrap();
1166 CtxDeclTerminal::V2 { terminal }
1167 }
1168 _ => panic!("unexpected alt id {alt_id} in fn exit_decl_terminal")
1169 };
1170 let val = self.listener.exit_decl_terminal(ctx);
1171 self.stack.push(SynValue::DeclTerminal(val));
1172 }
1173
1174 fn exit_ruleset(&mut self) {
1175 let ctx = CtxRuleset::V1;
1176 let val = self.listener.exit_ruleset(ctx);
1177 self.stack.push(SynValue::Ruleset(val));
1178 }
1179
1180 fn exit_rule_iter(&mut self) {
1181 let rule = self.stack.pop().unwrap().get_rule();
1182 let ctx = CtxRuleIter::V1 { rule };
1183 self.listener.exit_rule_iter(ctx);
1184 }
1185
1186 fn exit_rule(&mut self, alt_id: AltId) {
1187 let ctx = match alt_id {
1188 53 => {
1189 let prs_expr = self.stack.pop().unwrap().get_prs_expr();
1190 let rule_nt = self.stack.pop().unwrap().get_rule_nt();
1191 CtxRule::V2 { rule_nt, prs_expr }
1192 }
1193 54 => {
1194 let rts_expr = self.stack.pop().unwrap().get_rts_expr();
1195 let rule_nt = self.stack.pop().unwrap().get_rule_nt();
1196 CtxRule::V1 { rule_nt, rts_expr }
1197 }
1198 _ => panic!("unexpected alt id {alt_id} in fn exit_rule")
1199 };
1200 let val = self.listener.exit_rule(ctx);
1201 self.stack.push(SynValue::Rule(val));
1202 }
1203
1204 fn exit_rule_nt(&mut self) {
1205 let nonterminal = self.stack_t.pop().unwrap();
1206 let ctx = CtxRuleNt::V1 { nonterminal };
1207 let val = self.listener.exit_rule_nt(ctx);
1208 self.stack.push(SynValue::RuleNt(val));
1209 }
1210
1211 fn exit_rts_expr(&mut self, alt_id: AltId) {
1212 let ctx = match alt_id {
1213 11 => {
1214 let rts_children = self.stack.pop().unwrap().get_rts_children();
1215 CtxRtsExpr::V1 { rts_children }
1216 }
1217 12 => {
1218 let rts_children = self.stack.pop().unwrap().get_rts_children();
1219 CtxRtsExpr::V2 { rts_children }
1220 }
1221 13 => {
1222 let rts_children = self.stack.pop().unwrap().get_rts_children();
1223 CtxRtsExpr::V3 { rts_children }
1224 }
1225 14 => {
1226 let rts_children = self.stack.pop().unwrap().get_rts_children();
1227 CtxRtsExpr::V4 { rts_children }
1228 }
1229 15 => {
1230 let rts_children = self.stack.pop().unwrap().get_rts_children();
1231 CtxRtsExpr::V5 { rts_children }
1232 }
1233 16 => {
1234 let item = self.stack.pop().unwrap().get_item();
1235 CtxRtsExpr::V6 { item }
1236 }
1237 _ => panic!("unexpected alt id {alt_id} in fn exit_rts_expr")
1238 };
1239 let val = self.listener.exit_rts_expr(ctx);
1240 self.stack.push(SynValue::RtsExpr(val));
1241 }
1242
1243 fn exit_rts_children(&mut self) {
1244 let star = self.stack.pop().unwrap().get_rts_children1();
1245 let ctx = CtxRtsChildren::V1 { star };
1246 let val = self.listener.exit_rts_children(ctx);
1247 self.stack.push(SynValue::RtsChildren(val));
1248 }
1249
1250 fn init_rts_children1(&mut self) {
1251 let val = SynRtsChildren1(Vec::new());
1252 self.stack.push(SynValue::RtsChildren1(val));
1253 }
1254
1255 fn exit_rts_children1(&mut self) {
1256 let rts_expr = self.stack.pop().unwrap().get_rts_expr();
1257 let Some(SynValue::RtsChildren1(SynRtsChildren1(star_acc))) = self.stack.last_mut() else {
1258 panic!("unexpected SynRtsChildren1 item on wrapper stack");
1259 };
1260 star_acc.push(rts_expr);
1261 }
1262
1263 fn exit_prs_expr1(&mut self, alt_id: AltId) {
1264 let ctx = match alt_id {
1265 32 => {
1266 let prs_expr = self.stack.pop().unwrap().get_prs_expr();
1267 CtxPrsExpr::V1 { prs_expr }
1268 }
1269 33 => {
1270 let prs_expr = self.stack.pop().unwrap().get_prs_expr();
1271 CtxPrsExpr::V2 { prs_expr }
1272 }
1273 34 => {
1274 let prs_expr = self.stack.pop().unwrap().get_prs_expr();
1275 CtxPrsExpr::V3 { prs_expr }
1276 }
1277 35 => {
1278 let prs_expr_2 = self.stack.pop().unwrap().get_prs_expr();
1279 let prs_expr_1 = self.stack.pop().unwrap().get_prs_expr();
1280 CtxPrsExpr::V4 { prs_expr: [prs_expr_1, prs_expr_2] }
1281 }
1282 36 => {
1283 let prs_expr_2 = self.stack.pop().unwrap().get_prs_expr();
1284 let prs_expr_1 = self.stack.pop().unwrap().get_prs_expr();
1285 CtxPrsExpr::V5 { prs_expr: [prs_expr_1, prs_expr_2] }
1286 }
1287 _ => panic!("unexpected alt id {alt_id} in fn exit_prs_expr1")
1288 };
1289 let val = self.listener.exit_prs_expr(ctx);
1290 self.stack.push(SynValue::PrsExpr(val));
1291 }
1292
1293 fn exit_prs_expr6(&mut self, alt_id: AltId) {
1294 let ctx = match alt_id {
1295 49 => {
1296 let prs_expr = self.stack.pop().unwrap().get_prs_expr();
1297 CtxPrsExpr::V6 { prs_expr }
1298 }
1299 50 => {
1300 let item = self.stack.pop().unwrap().get_item();
1301 CtxPrsExpr::V7 { item }
1302 }
1303 _ => panic!("unexpected alt id {alt_id} in fn exit_prs_expr6")
1304 };
1305 let val = self.listener.exit_prs_expr(ctx);
1306 self.stack.push(SynValue::PrsExpr(val));
1307 }
1308
1309 fn exit_item(&mut self, alt_id: AltId) {
1310 let ctx = match alt_id {
1311 19 => {
1312 let nonterminal = self.stack_t.pop().unwrap();
1313 CtxItem::V1 { nonterminal }
1314 }
1315 20 => {
1316 let ntx = self.stack_t.pop().unwrap();
1317 CtxItem::V2 { ntx }
1318 }
1319 21 => {
1320 let terminal = self.stack_t.pop().unwrap();
1321 CtxItem::V3 { terminal }
1322 }
1323 22 => {
1324 let terminalcst = self.stack_t.pop().unwrap();
1325 CtxItem::V4 { terminalcst }
1326 }
1327 23 => {
1328 let tx = self.stack_t.pop().unwrap();
1329 CtxItem::V5 { tx }
1330 }
1331 24 => {
1332 let empty = self.stack_t.pop().unwrap();
1333 CtxItem::V6 { empty }
1334 }
1335 25 => {
1336 let ltag = self.stack_t.pop().unwrap();
1337 CtxItem::V7 { ltag }
1338 }
1339 26 => {
1340 CtxItem::V8
1341 }
1342 27 => {
1343 CtxItem::V9
1344 }
1345 _ => panic!("unexpected alt id {alt_id} in fn exit_item")
1346 };
1347 let val = self.listener.exit_item(ctx);
1348 self.stack.push(SynValue::Item(val));
1349 }
1350 }
1351
1352 }
1354
1355