lexigram_lib/rtsgen/
mod.rs

1// Copyright (c) 2025 Redglyph (@gmail.com). All Rights Reserved.
2
3// =============================================================================================
4// Parser for the simplified grammars used in unit tests
5// (lexer/parser generated by the build-rtsgen crate)
6
7mod 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); // errors are written in the log, so we can dismiss the error here
67        let listener = wrapper.give_listener();
68        listener.make_rts()
69    }
70}
71
72// listener implementation
73
74struct 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    /// terminal information; `(String, Option<String>)` = (token name, optional string if not variable)
84    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    /// Gets the nonterminal ID corresponding to the name, creating it if
143    /// it doesn't exist.
144    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    /// Gets the terminal ID corresponding to the name or value, creating it if
154    /// it doesn't exist.
155    ///
156    /// Returns
157    /// * `IsNew` = `Yes` if the terminal had to be created, `No` otherwise
158    /// * `TokenId` = the terminal ID
159    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"); // VarId = TokenId
164            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    /// Finalizes the rules and creates the symbol table.
190    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        // detects undefined nonterminals
199        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(); // comes from hashmap
204            self.log.add_error(format!("undefined nonterminals: {}", undefined.into_iter().map(|s| format!("'{s}'")).join(", ")));
205            return;
206        }
207
208        // builds symbol table
209        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        // puts names to constant terminals
220        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        // remove reserved nonterminals
228        for v in &self.reserved_nt {
229            self.rules[*v as usize].clear();
230        }
231
232        // reorders nonterminal IDs by order of definition rather than order of appearance
233        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            // decl_terminal -> Terminal "=" TerminalCst
272            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            // decl_terminal -> Terminal
287            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            // rule -> rule_nt "->" prs_expr ";"
314            CtxRule::V1 { rule_nt: SynRuleNt(var), rts_expr: SynRtsExpr(id_expr) }
315            // rule -> rule_nt "=>" rts_expr ";"
316            | 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            // rts_expr -> "&" rts_children
348            CtxRtsExpr::V1 { rts_children: SynRtsChildren(v) } =>
349                tree.addci_iter(None, GrNode::Concat, v.into_iter().map(|SynRtsExpr(id)| id)),
350            // rts_expr -> "|" rts_children
351            CtxRtsExpr::V2 { rts_children: SynRtsChildren(v) } =>
352                tree.addci_iter(None, GrNode::Or, v.into_iter().map(|SynRtsExpr(id)| id)),
353            // rts_expr -> "+" rts_children
354            CtxRtsExpr::V3 { rts_children: SynRtsChildren(v) } =>
355                tree.addci_iter(None, GrNode::Plus, v.into_iter().map(|SynRtsExpr(id)| id)),
356            // rts_expr -> "*" rts_children
357            CtxRtsExpr::V4 { rts_children: SynRtsChildren(v) } =>
358                tree.addci_iter(None, GrNode::Star, v.into_iter().map(|SynRtsExpr(id)| id)),
359            // rts_expr -> "?" rts_children
360            CtxRtsExpr::V5 { rts_children: SynRtsChildren(v) } =>
361                tree.addci_iter(None, GrNode::Maybe, v.into_iter().map(|SynRtsExpr(id)| id)),
362            // rts_expr -> item
363            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        // rts_children -> "(" rts_expr* ")"
371        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            // prs_expr -> prs_expr "+"
379            CtxPrsExpr::V1 { prs_expr: SynPrsExpr(id) } =>
380                tree.addci(None, GrNode::Plus, id),
381            // prs_expr -> prs_expr "*"
382            CtxPrsExpr::V2 { prs_expr: SynPrsExpr(id) } =>
383                tree.addci(None, GrNode::Star, id),
384            // prs_expr -> prs_expr "?"
385            CtxPrsExpr::V3 { prs_expr: SynPrsExpr(id) } =>
386                tree.addci(None, GrNode::Maybe, id),
387            // prs_expr -> prs_expr prs_expr
388            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            // prs_expr -> prs_expr "|" prs_expr
396            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            // prs_expr -> "(" prs_expr ")"
404            CtxPrsExpr::V6 { prs_expr: SynPrsExpr(id) } => id,
405            // prs_expr -> item
406            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            // item -> Nonterminal
414            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            // item -> NTx (NT symbol without any check or creation process)
419            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            // item -> Terminal
430            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            // item -> TerminalCst
438            CtxItem::V4 { terminalcst } => {
439                let (is_new, tok) = self.get_or_create_t(terminalcst.clone());
440                if let IsNew::Yes = is_new {
441                    // the names will be set later, to give priority to variable terminal names in case of conflict
442                    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            // item -> Tx (T symbol without any check or creation process)
455            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            // item -> Empty
466            CtxItem::V6 { .. } =>
467                self.curr.as_mut().unwrap().add(None, GrNode::Symbol(Symbol::Empty)),
468            // item -> LTag
469            CtxItem::V7 { ltag } => {
470                // `ltag` contains "<L=name>" or "<L>"
471                let var = if ltag.len() > 3 {
472                    let name = &ltag[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            // item -> "<P>"
484            CtxItem::V8 => self.curr.as_mut().unwrap().add(None, GrNode::PrecEq),
485            // item -> "<R>"
486            CtxItem::V9 => self.curr.as_mut().unwrap().add(None, GrNode::RAssoc),
487        };
488        SynItem(id)
489    }
490}
491
492/// Decodes a string literal (without its surrounding quotes). There must be at least two characters in `strlit`.
493fn 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
525// -------------------------------------------------------------------------
526// User types used in the listener interface:
527// (initially copied/uncommented from the generated parser code)
528
529pub mod listener_types {
530    use crate::VarId;
531
532    /// User-defined type for `file`
533    #[derive(Debug, PartialEq)] pub struct SynFile();
534    /// User-defined type for `decls`
535    #[derive(Debug, PartialEq)] pub struct SynDecls();
536    /// User-defined type for `decl`
537    #[derive(Debug, PartialEq)] pub struct SynDecl();
538    /// User-defined type for `decl_terminal`
539    #[derive(Debug, PartialEq)] pub struct SynDeclTerminal();
540    /// User-defined type for `ruleset`
541    #[derive(Debug, PartialEq)] pub struct SynRuleset();
542    /// User-defined type for `rule`
543    #[derive(Debug, PartialEq)] pub struct SynRule();
544    /// User-defined type for `rule_nt`
545    #[derive(Debug, PartialEq)] pub struct SynRuleNt(pub VarId);
546    /// User-defined type for `rts_expr`
547    #[derive(Debug, PartialEq)] pub struct SynRtsExpr(pub usize);
548    /// User-defined type for `rts_children`
549    #[derive(Debug, PartialEq)] pub struct SynRtsChildren(pub Vec<SynRtsExpr>);
550    /// User-defined type for `prs_expr`
551    #[derive(Debug, PartialEq)] pub struct SynPrsExpr(pub usize);
552    /// User-defined type for `item`
553    #[derive(Debug, PartialEq)] pub struct SynItem(pub usize);
554}
555
556// -------------------------------------------------------------------------
557
558pub mod rtsgen_lexer {
559    // Generated code, don't modify manually anything between the tags below
560    use crate as lexigram_lib;
561
562    // [rtsgen_lexer]
563
564    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,   // 0-15
575         30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,   // 16-31
576          0,  30,   1,  30,  30,  30,   2,  30,   3,   4,   5,   6,   7,   8,  30,   9,   // 32-47
577         36,  29,  29,  29,  29,  29,  29,  29,  29,  29,  30,  10,  11,  12,  23,  13,   // 48-63
578         30,  28,  28,  28,  28,  28,  28,  33,  33,  33,  33,  33,  14,  33,  15,  33,   // 64-79
579         26,  33,  27,  33,  16,  33,  33,  33,  33,  33,  33,  30,  24,  30,  30,  34,   // 80-95
580         30,  32,  32,  32,  32,  40,  32,  35,  35,  35,  35,  39,  35,  35,  41,  37,   // 96-111
581         35,  35,  17,  35,  18,  31,  35,  35,  35,  35,  35,  19,  20,  25,  30,  30,   // 112-127
582    ];
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, // state 0
629         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, // state 1
630         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, // state 2
631         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, // state 3
632         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, // state 4
633         54,  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, // state 5
634          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, // state 6
635          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, // state 7
636         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, // state 8
637         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, // state 9
638         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, // state 10
639         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, // state 11
640         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, // state 12
641         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, // state 13
642         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, // state 14
643         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, // state 15
644         54,  54,  54,  54,  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, // state 16
645         54,  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, // state 17
646         54,  54,  54,  54,  54,  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, // state 18
647         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, // state 19
648         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, // state 20
649         54,  54,  54,  54,  54,  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, // state 21
650         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, // state 22 <skip>
651         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 23 <end:2>
652         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 24 <end:10>
653         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 25 <end:11>
654         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 26 <end:5>
655         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 27 <end:4>
656         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 28 <end:9>
657         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 29 <end:12>
658         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, // state 30 <end:8>
659         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 31 <end:6>
660         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, // state 32 <end:18>
661         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, // state 33 <end:18>
662         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, // state 34 <end:18>
663         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, // state 35 <end:19>
664         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, // state 36 <end:19>
665         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 37 <end:3>
666         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 38 <end:7>
667         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, // state 39 <skip>
668         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 40 <skip>
669         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 41 <end:0>
670         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 42 <end:1>
671         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 43 <end:13>
672         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 44 <end:14>
673         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 45 <end:15>
674         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, // state 46 <end:19>
675         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, // state 47 <end:19>
676         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, // state 48 <end:19>
677         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, // state 49 <end:16>
678         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 50 <end:17>
679         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, // state 51 <end:18>
680         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 52 <end:20>
681         54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54, // state 53 <end:21>
682         54 // error group in [nbr_state * nbr_group + nbr_group]
683    ];
684
685    pub fn build_lexer<R: Read>() -> Lexer<'static, R> {
686        Lexer::new(
687            // parameters
688            NBR_GROUPS,
689            INITIAL_STATE,
690            FIRST_END_STATE,
691            NBR_STATES,
692            // tables
693            &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    // [rtsgen_lexer]
702}
703
704// -------------------------------------------------------------------------
705
706pub mod rtsgen_parser {
707    // Generated code, don't modify manually anything between the tags below
708    use crate as lexigram_lib;
709
710    // [rtsgen_parser]
711
712    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        /// `file -> decls ruleset`
743        V1 { decls: SynDecls, ruleset: SynRuleset },
744    }
745    #[derive(Debug)]
746    pub enum CtxDecls {
747        /// `decls -> (<L> decl)*`
748        V1,
749    }
750    #[derive(Debug)]
751    pub enum CtxDeclIter {
752        /// `<L> decl` iteration in `decls -> ( ►► <L> decl ◄◄ )*`
753        V1 { decl: SynDecl },
754    }
755    #[derive(Debug)]
756    pub enum CtxDecl {
757        /// `decl -> "token" decl_terminal ("," decl_terminal)* ";"`
758        V1 { decl_terminal: SynDeclTerminal, star: SynDecl1 },
759    }
760    #[derive(Debug)]
761    pub enum CtxDeclTerminal {
762        /// `decl_terminal -> Terminal "=" TerminalCst`
763        V1 { terminal: String, terminalcst: String },
764        /// `decl_terminal -> Terminal`
765        V2 { terminal: String },
766    }
767    #[derive(Debug)]
768    pub enum CtxRuleset {
769        /// `ruleset -> (<L> rule)*`
770        V1,
771    }
772    #[derive(Debug)]
773    pub enum CtxRuleIter {
774        /// `<L> rule` iteration in `ruleset -> ( ►► <L> rule ◄◄ )*`
775        V1 { rule: SynRule },
776    }
777    #[derive(Debug)]
778    pub enum CtxRule {
779        /// `rule -> rule_nt "=>" rts_expr ";"`
780        V1 { rule_nt: SynRuleNt, rts_expr: SynRtsExpr },
781        /// `rule -> rule_nt "->" prs_expr ";"`
782        V2 { rule_nt: SynRuleNt, prs_expr: SynPrsExpr },
783    }
784    #[derive(Debug)]
785    pub enum CtxRuleNt {
786        /// `rule_nt -> Nonterminal`
787        V1 { nonterminal: String },
788    }
789    #[derive(Debug)]
790    pub enum CtxRtsExpr {
791        /// `rts_expr -> "&" rts_children`
792        V1 { rts_children: SynRtsChildren },
793        /// `rts_expr -> "|" rts_children`
794        V2 { rts_children: SynRtsChildren },
795        /// `rts_expr -> "+" rts_children`
796        V3 { rts_children: SynRtsChildren },
797        /// `rts_expr -> "*" rts_children`
798        V4 { rts_children: SynRtsChildren },
799        /// `rts_expr -> "?" rts_children`
800        V5 { rts_children: SynRtsChildren },
801        /// `rts_expr -> item`
802        V6 { item: SynItem },
803    }
804    #[derive(Debug)]
805    pub enum CtxRtsChildren {
806        /// `rts_children -> "(" rts_expr* ")"`
807        V1 { star: SynRtsChildren1 },
808    }
809    #[derive(Debug)]
810    pub enum CtxPrsExpr {
811        /// `prs_expr -> prs_expr "+"`
812        V1 { prs_expr: SynPrsExpr },
813        /// `prs_expr -> prs_expr "*"`
814        V2 { prs_expr: SynPrsExpr },
815        /// `prs_expr -> prs_expr "?"`
816        V3 { prs_expr: SynPrsExpr },
817        /// `prs_expr -> prs_expr prs_expr`
818        V4 { prs_expr: [SynPrsExpr; 2] },
819        /// `prs_expr -> prs_expr "|" prs_expr`
820        V5 { prs_expr: [SynPrsExpr; 2] },
821        /// `prs_expr -> "(" prs_expr ")"`
822        V6 { prs_expr: SynPrsExpr },
823        /// `prs_expr -> item`
824        V7 { item: SynItem },
825    }
826    #[derive(Debug)]
827    pub enum CtxItem {
828        /// `item -> Nonterminal`
829        V1 { nonterminal: String },
830        /// `item -> NTx`
831        V2 { ntx: String },
832        /// `item -> Terminal`
833        V3 { terminal: String },
834        /// `item -> TerminalCst`
835        V4 { terminalcst: String },
836        /// `item -> Tx`
837        V5 { tx: String },
838        /// `item -> Empty`
839        V6 { empty: String },
840        /// `item -> LTag`
841        V7 { ltag: String },
842        /// `item -> "<P>"`
843        V8,
844        /// `item -> "<R>"`
845        V9,
846    }
847
848    // NT types and user-defined type templates (copy elsewhere and uncomment when necessary):
849
850    // /// User-defined type for `file`
851    // #[derive(Debug, PartialEq)] pub struct SynFile();
852    // /// User-defined type for `decls`
853    // #[derive(Debug, PartialEq)] pub struct SynDecls();
854    // /// User-defined type for `decl`
855    // #[derive(Debug, PartialEq)] pub struct SynDecl();
856    // /// User-defined type for `decl_terminal`
857    // #[derive(Debug, PartialEq)] pub struct SynDeclTerminal();
858    // /// User-defined type for `ruleset`
859    // #[derive(Debug, PartialEq)] pub struct SynRuleset();
860    // /// User-defined type for `rule`
861    // #[derive(Debug, PartialEq)] pub struct SynRule();
862    // /// User-defined type for `rule_nt`
863    // #[derive(Debug, PartialEq)] pub struct SynRuleNt();
864    // /// User-defined type for `rts_expr`
865    // #[derive(Debug, PartialEq)] pub struct SynRtsExpr();
866    // /// User-defined type for `rts_children`
867    // #[derive(Debug, PartialEq)] pub struct SynRtsChildren();
868    // /// User-defined type for `prs_expr`
869    // #[derive(Debug, PartialEq)] pub struct SynPrsExpr();
870    // /// User-defined type for `item`
871    // #[derive(Debug, PartialEq)] pub struct SynItem();
872    /// Computed `("," decl_terminal)*` array in `decl -> "token" decl_terminal  ►► ("," decl_terminal)* ◄◄  ";"`
873    #[derive(Debug, PartialEq)]
874    pub struct SynDecl1(pub Vec<SynDeclTerminal>);
875    /// Computed `rts_expr*` array in `rts_children -> "("  ►► rts_expr* ◄◄  ")"`
876    #[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        /// Checks if the listener requests an abort. This happens if an error is too difficult to recover from
926        /// and may corrupt the stack content. In that case, the parser immediately stops and returns `ParserError::AbortRequest`.
927        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(),             // file
981                        1 => self.listener.init_decls(),            // decls
982                        2 => self.listener.init_decl_iter(),        // decl_iter
983                        3 => self.listener.init_decl(),             // decl
984                        13 => self.init_decl1(),                    // decl_1
985                        4 => self.listener.init_decl_terminal(),    // decl_terminal
986                        21 => {}                                    // decl_terminal_1
987                        5 => self.listener.init_ruleset(),          // ruleset
988                        6 => self.listener.init_rule_iter(),        // rule_iter
989                        7 => self.listener.init_rule(),             // rule
990                        22 => {}                                    // rule_1
991                        8 => self.listener.init_rule_nt(),          // rule_nt
992                        9 => self.listener.init_rts_expr(),         // rts_expr
993                        10 => self.listener.init_rts_children(),    // rts_children
994                        14 => self.init_rts_children1(),            // rts_children_1
995                        11 => self.listener.init_prs_expr(),        // prs_expr
996                        15 ..= 20 => {}                             // prs_expr_1, prs_expr_2, prs_expr_3, prs_expr_4, prs_expr_5, prs_expr_6
997                        12 => self.listener.init_item(),            // item
998                        _ => panic!("unexpected enter nonterminal id: {nt}")
999                    }
1000                }
1001                Call::Loop => {}
1002                Call::Exit => {
1003                    match alt_id {
1004                        0 => self.exit_file(),                      // file -> decls ruleset
1005                        1 => self.exit_decls(),                     // decls -> decl_iter
1006                        2 => self.exit_decl_iter(),                 // decl_iter -> <L> decl decl_iter
1007                        3 => {}                                     // decl_iter -> <L> ε (not used)
1008                        4 => self.exit_decl(),                      // decl -> "token" decl_terminal decl_1 ";"
1009                        28 => self.exit_decl1(),                    // decl_1 -> "," decl_terminal decl_1
1010                        29 => {}                                    // decl_1 -> ε
1011                        51 |                                        // decl_terminal_1 -> "=" TerminalCst
1012                        52 => self.exit_decl_terminal(alt_id),      // decl_terminal_1 -> ε
1013                     /* 5 */                                        // decl_terminal -> Terminal decl_terminal_1 (never called)
1014                        6 => self.exit_ruleset(),                   // ruleset -> rule_iter
1015                        7 => self.exit_rule_iter(),                 // rule_iter -> <L> rule rule_iter
1016                        8 => {}                                     // rule_iter -> <L> ε (not used)
1017                        53 |                                        // rule_1 -> "->" prs_expr ";"
1018                        54 => self.exit_rule(alt_id),               // rule_1 -> "=>" rts_expr ";"
1019                     /* 9 */                                        // rule -> rule_nt rule_1 (never called)
1020                        10 => self.exit_rule_nt(),                  // rule_nt -> Nonterminal
1021                        11 |                                        // rts_expr -> "&" rts_children
1022                        12 |                                        // rts_expr -> "|" rts_children
1023                        13 |                                        // rts_expr -> "+" rts_children
1024                        14 |                                        // rts_expr -> "*" rts_children
1025                        15 |                                        // rts_expr -> "?" rts_children
1026                        16 => self.exit_rts_expr(alt_id),           // rts_expr -> item
1027                        17 => self.exit_rts_children(),             // rts_children -> "(" rts_children_1 ")"
1028                        30 => self.exit_rts_children1(),            // rts_children_1 -> rts_expr rts_children_1
1029                        31 => {}                                    // rts_children_1 -> ε
1030                        32 |                                        // prs_expr_1 -> "+" prs_expr_1
1031                        33 |                                        // prs_expr_1 -> "*" prs_expr_1
1032                        34 |                                        // prs_expr_1 -> "?" prs_expr_1
1033                        35 |                                        // prs_expr_1 -> prs_expr_4 prs_expr_1
1034                        36 => self.exit_prs_expr1(alt_id),          // prs_expr_1 -> "|" prs_expr_2 prs_expr_1
1035                        39 |                                        // prs_expr_3 -> "+" prs_expr_3 (duplicate of 32)
1036                        45 => self.exit_prs_expr1(32),              // prs_expr_5 -> "+" prs_expr_5 (duplicate of 32)
1037                        40 |                                        // prs_expr_3 -> "*" prs_expr_3 (duplicate of 33)
1038                        46 => self.exit_prs_expr1(33),              // prs_expr_5 -> "*" prs_expr_5 (duplicate of 33)
1039                        41 |                                        // prs_expr_3 -> "?" prs_expr_3 (duplicate of 34)
1040                        47 => self.exit_prs_expr1(34),              // prs_expr_5 -> "?" prs_expr_5 (duplicate of 34)
1041                        42 => self.exit_prs_expr1(35),              // prs_expr_3 -> prs_expr_4 prs_expr_3 (duplicate of 35)
1042                        49 |                                        // prs_expr_6 -> "(" prs_expr ")"
1043                        50 => self.exit_prs_expr6(alt_id),          // prs_expr_6 -> item
1044                        18 => {}                                    // prs_expr -> prs_expr_6 prs_expr_1 (not used)
1045                        37 => {}                                    // prs_expr_1 -> ε (not used)
1046                        38 => {}                                    // prs_expr_2 -> prs_expr_6 prs_expr_3 (not used)
1047                        43 => {}                                    // prs_expr_3 -> ε (not used)
1048                        44 => {}                                    // prs_expr_4 -> prs_expr_6 prs_expr_5 (not used)
1049                        48 => {}                                    // prs_expr_5 -> ε (not used)
1050                        19 |                                        // item -> Nonterminal
1051                        20 |                                        // item -> NTx
1052                        21 |                                        // item -> Terminal
1053                        22 |                                        // item -> TerminalCst
1054                        23 |                                        // item -> Tx
1055                        24 |                                        // item -> Empty
1056                        25 |                                        // item -> LTag
1057                        26 |                                        // item -> "<P>"
1058                        27 => self.exit_item(alt_id),               // item -> "<R>"
1059                        _ => 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    // [rtsgen_parser]
1353}
1354
1355// -------------------------------------------------------------------------