chiru 0.7.0

A parser generator similar to antlr4.
Documentation
pub trait {{ctx_name.2}}Context: ToRule {
  {% for item in nonterminal_list %}
  fn {{item.0}}_list(&self) -> Vec<&dyn {{item.2}}Context>;{% endfor %}

  {% for item in terminal_list %}
  fn {{item.0}}_list(&self) -> Vec<&TerminalContext>;{% endfor %}

  {% for item in nonterminal %}
  fn {{item.0}}(&self) -> Option<&dyn {{item.2}}Context>;{% endfor %}

  {% for item in terminal %}
  fn {{item.0}}(&self) -> Option<&TerminalContext>;{% endfor %}

  fn accept(&self, visitor: &mut dyn {{grammar_name.2}}Visitor) -> Result<Box<dyn Any>, Box<dyn Error>>;
  fn enter(&self, listener: &mut dyn {{grammar_name.2}}Listener);
  fn exit(&self, listener: &mut dyn {{grammar_name.2}}Listener);
}

impl {{ ctx_name.2 }}Context for RuleContext {

  {% for item in nonterminal_list %}
  fn {{item.0}}_list(&self) -> Vec<&dyn {{item.2}}Context> {
    self.get_rule_contexts({{grammar_name.2}}Parser::{{item.1}}).iter().map(|ctx| *ctx as &dyn {{item.2}}Context).collect::<Vec<_>>()
  } {% endfor %}

  {% for item in terminal_list %}
  fn {{item.0}}_list(&self) -> Vec<&TerminalContext> {
    self.get_terminals({{grammar_name.2}}Lexer::{{item.1}})
  } {% endfor %}

  {% for item in nonterminal %}
  fn {{item.0}}(&self) -> Option<&dyn {{item.2}}Context> {
    self.get_rule_context({{grammar_name.2}}Parser::{{item.1}}, 0).map(|ctx| ctx as &dyn {{item.2}}Context)
  } {% endfor %}

  {% for item in terminal %}
  fn {{item.0}}(&self) -> Option<&TerminalContext> {
    self.get_terminal({{grammar_name.2}}Lexer::{{item.1}}, 0)
  } {% endfor %}


  fn accept(&self, visitor: &mut dyn {{grammar_name.2}}Visitor) -> Result<Box<dyn Any>, Box<dyn Error>> {
    visitor.visit_{{ ctx_name.0 }}(self)
  }

  fn enter(&self, listener: &mut dyn {{grammar_name.2}}Listener) {
    listener.enter_{{ ctx_name.0 }}(self)
  }

  fn exit(&self, listener: &mut dyn {{grammar_name.2}}Listener) {
    listener.exit_{{ ctx_name.0 }}(self)
  }
}