// Path: src/main/java/com/github/kmizu/yapp/Ast.java
// public static abstract class Expression extends Node {
//   public Expression(Position pos){
//     super(pos);
//   }
// }
// 
// Path: src/main/java/com/github/kmizu/yapp/Ast.java
// public static class Grammar extends Node implements Iterable<Rule> {
//   private Symbol name;
//   private final List<MacroDefinition> macros;
//   private final List<Rule> rules;
// 
//   public Grammar(Position pos, Symbol name, List<MacroDefinition> macros, List<Rule> rules){
//     super(pos);
//     this.name = name;
//     this.macros = macros;
//     this.rules = rules;
//   }
// 
//   public Iterator<Rule> iterator() {
//     return rules.iterator();
//   }
// 
//   public Symbol name() {
//     return name;
//   }
//     
//   public void setName(Symbol name) {
//     this.name = name;
//   }
//     
//   public List<MacroDefinition> macros() {
//     return macros;
//   }
// 
//   public List<Rule> getRules() {
//     return rules;
//   }
// 
//   @Override
//   public <R, C> R accept(Visitor<R, C> visitor, C context) {
//     return visitor.visit(this, context);
//   }
//     
//   @Override
//   public String toString() {
//     StringBuffer buf = new StringBuffer();
//     buf.append("grammar " + name + ";");
//     buf.append(SystemProperties.LINE_SEPARATOR);
//     buf.append(SystemProperties.LINE_SEPARATOR);
//     for(Rule r : rules) {
//       buf.append(r);
//       buf.append(SystemProperties.LINE_SEPARATOR);
//       buf.append(SystemProperties.LINE_SEPARATOR);
//     }
//     return new String(buf);
//   }
// }
// 
// Path: src/main/java/com/github/kmizu/yapp/Ast.java
// public static class NonTerminal extends Expression {
//   private Symbol name;
//   private Symbol var;
// 
//   public NonTerminal(Position pos, Symbol name, Symbol var) {
//     super(pos);
//     this.name = name;
//     this.var  = var;
//   }
// 
//   public NonTerminal(Position pos, Symbol name){
//     this(pos, name, null);
//   }
// 
//   public Symbol name() {
//     return name;
//   }
// 
//   public Symbol var() {
//     return var;
//   }
// 
//   @Override
//   public String toString() {
//     return var != null ? var + ":" + name.toString() : name.toString();
//   }
// 
//   @Override
//   public <R, C> R accept(Visitor<R, C> visitor, C context) {
//     return visitor.visit(this, context);
//   }
// }
// 
// Path: src/main/java/com/github/kmizu/yapp/Ast.java
// public static class Rule extends Node {
//   public static final int BOUNDED = 1;
//   private int flags;
//   private Symbol name;
//   private Symbol type;
//   private Expression expression;
//   private String code;
// 
//   public Rule(Position pos, int flags, Symbol name, Symbol type, Expression expression, String code){
//     super(pos);
//     this.flags = flags;
//     this.name = name;
//     this.type = type;
//     this.expression = expression;
//     this.code = code;
//   }
//     
//   public int flags() {
//     return flags;
//   }
// 
//   public Symbol name() {
//     return name;
//   }
// 
//   public Symbol type() {
//     return type;
//   }
// 
//   public Expression body() {
//     return expression;
//   }
// 
//   public String code() {
//     return code;
//   }
// 
//   @Override
//   public String toString() {
//     return ((flags & BOUNDED) != 0 ? "bounded " : "") + 
//             name + " = " +  expression +  " ;";
//   }
// 
//   @Override
//   public <R, C> R accept(Visitor<R, C> visitor, C context) {
//     return visitor.visit(this, context);
//   }
// }


import java.util.ArrayList;
import java.util.LinkedHashMap;
import com.github.kmizu.yapp.Symbol;
import com.github.kmizu.yapp.Ast.Expression;
import com.github.kmizu.yapp.Ast.Grammar;
import com.github.kmizu.yapp.Ast.NonTerminal;
import com.github.kmizu.yapp.Ast.Rule;
package com.github.kmizu.yapp.translator;



public class RuleInliner extends AbstractGrammarExpander<RuleInliner.Context> {
  static class Context {
// Path: src/main/java/com/github/kmizu/yapp/Ast.java
// public static abstract class Expression extends Node {
//   public Expression(Position pos){
//     super(pos);
//   }
// }
// 
// Path: src/main/java/com/github/kmizu/yapp/Ast.java
// public static class Grammar extends Node implements Iterable<Rule> {
//   private Symbol name;
//   private final List<MacroDefinition> macros;
//   private final List<Rule> rules;
// 
//   public Grammar(Position pos, Symbol name, List<MacroDefinition> macros, List<Rule> rules){
//     super(pos);
//     this.name = name;
//     this.macros = macros;
//     this.rules = rules;
//   }
// 
//   public Iterator<Rule> iterator() {
//     return rules.iterator();
//   }
// 
//   public Symbol name() {
//     return name;
//   }
//     
//   public void setName(Symbol name) {
//     this.name = name;
//   }
//     
//   public List<MacroDefinition> macros() {
//     return macros;
//   }
// 
//   public List<Rule> getRules() {
//     return rules;
//   }
// 
//   @Override
//   public <R, C> R accept(Visitor<R, C> visitor, C context) {
//     return visitor.visit(this, context);
//   }
//     
//   @Override
//   public String toString() {
//     StringBuffer buf = new StringBuffer();
//     buf.append("grammar " + name + ";");
//     buf.append(SystemProperties.LINE_SEPARATOR);
//     buf.append(SystemProperties.LINE_SEPARATOR);
//     for(Rule r : rules) {
//       buf.append(r);
//       buf.append(SystemProperties.LINE_SEPARATOR);
//       buf.append(SystemProperties.LINE_SEPARATOR);
//     }
//     return new String(buf);
//   }
// }
// 
// Path: src/main/java/com/github/kmizu/yapp/Ast.java
// public static class NonTerminal extends Expression {
//   private Symbol name;
//   private Symbol var;
// 
//   public NonTerminal(Position pos, Symbol name, Symbol var) {
//     super(pos);
//     this.name = name;
//     this.var  = var;
//   }
// 
//   public NonTerminal(Position pos, Symbol name){
//     this(pos, name, null);
//   }
// 
//   public Symbol name() {
//     return name;
//   }
// 
//   public Symbol var() {
//     return var;
//   }
// 
//   @Override
//   public String toString() {
//     return var != null ? var + ":" + name.toString() : name.toString();
//   }
// 
//   @Override
//   public <R, C> R accept(Visitor<R, C> visitor, C context) {
//     return visitor.visit(this, context);
//   }
// }
// 
// Path: src/main/java/com/github/kmizu/yapp/Ast.java
// public static class Rule extends Node {
//   public static final int BOUNDED = 1;
//   private int flags;
//   private Symbol name;
//   private Symbol type;
//   private Expression expression;
//   private String code;
// 
//   public Rule(Position pos, int flags, Symbol name, Symbol type, Expression expression, String code){
//     super(pos);
//     this.flags = flags;
//     this.name = name;
//     this.type = type;
//     this.expression = expression;
//     this.code = code;
//   }
//     
//   public int flags() {
//     return flags;
//   }
// 
//   public Symbol name() {
//     return name;
//   }
// 
//   public Symbol type() {
//     return type;
//   }
// 
//   public Expression body() {
//     return expression;
//   }
// 
//   public String code() {
//     return code;
//   }
// 
//   @Override
//   public String toString() {
//     return ((flags & BOUNDED) != 0 ? "bounded " : "") + 
//             name + " = " +  expression +  " ;";
//   }
// 
//   @Override
//   public <R, C> R accept(Visitor<R, C> visitor, C context) {
//     return visitor.visit(this, context);
//   }
// }


// Path: src/main/java/com/github/kmizu/yapp/translator/RuleInliner.java
import java.util.ArrayList;
import java.util.LinkedHashMap;
import com.github.kmizu.yapp.Symbol;
import com.github.kmizu.yapp.Ast.Expression;
import com.github.kmizu.yapp.Ast.Grammar;
import com.github.kmizu.yapp.Ast.NonTerminal;
import com.github.kmizu.yapp.Ast.Rule;

package com.github.kmizu.yapp.translator;



public class RuleInliner extends AbstractGrammarExpander<RuleInliner.Context> {
  static class Context {
    LinkedHashMap<Symbol, Rule> env;