// Path: src/main/java/com/github/kmizu/yapp/Ast.java
// public static class N_Alternation extends VarArgExpression {
//   public N_Alternation(Position pos, List<Expression> expressions){
//     super(pos, expressions);
//   }
// 
// 
//   @Override
//   public String toString() {
//     StringBuffer buf = new StringBuffer();
//     buf.append("(");
//     buf.append(body.get(0).toString());
//     for(Expression e : body.subList(1,  body.size())){
//       buf.append(" / ");
//       buf.append(e.toString());
//     }
//     buf.append(")");
//     return new String(buf);
//   }
// 
//   @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 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 N_Sequence extends VarArgExpression {
//   public N_Sequence(Position pos, List<Expression> expressions) {
//     super(pos, expressions);
//   }
// 
//   @Override
//   public String toString() {
//     StringBuffer buf = new StringBuffer();
//     buf.append("(");
//     buf.append(body.get(0).toString());
//     for(Expression e : body.subList(1,  body.size())){
//       buf.append(" ");
//       buf.append(e.toString());
//     }
//     buf.append(")");
//     return new String(buf);
//   }
// 
//   @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/util/CollectionUtil.java
// public class CollectionUtil {
//   public static <T> List<T> list(T... elements) {
//     return new ArrayList<T>(Arrays.asList(elements));
//   }
//   
//   public static <A, B> Pair<A, B> t(A fst, B snd) {
//     return new Pair<A, B>(fst, snd);
//   }
//   
//   public static <K, V> Map<K, V> map(Pair<? extends K, ? extends V>... elements) {
//     Map<K, V> map = new HashMap<K, V>();
//     for(Pair<? extends K, ? extends V> e:elements) {
//       map.put(e.fst(), e.snd());
//     }
//     return map;
//   }
//   
//   public static <T> Set<T> set(T... elements) {
//     return new HashSet<T>(Arrays.asList(elements));
//   }
//   
//   public static <T> Set<T> setFrom(Collection<? extends T> collection) {
//     return new HashSet<T>(collection);
//   }
// }


import java.util.ArrayList;
import java.util.List;
import com.github.kmizu.yapp.Ast.N_Alternation;
import com.github.kmizu.yapp.Ast.Expression;
import com.github.kmizu.yapp.Ast.Grammar;
import com.github.kmizu.yapp.Ast.N_Sequence;
import static com.github.kmizu.yapp.util.CollectionUtil.*;
package com.github.kmizu.yapp.translator;




public class ExpressionFlattener implements Translator<Grammar, Grammar> {
  private Translator<Grammar, Grammar> f1 = new AbstractGrammarExpander<Void>(){
    @Override
    protected Expression visit(N_Sequence node, Void context) {
      List<Expression> es = node.body();
      List<Expression> result = new ArrayList<Expression>();
      Expression last = es.get(0);
      for(Expression e : es.subList(1, es.size())){
// Path: src/main/java/com/github/kmizu/yapp/Ast.java
// public static class N_Alternation extends VarArgExpression {
//   public N_Alternation(Position pos, List<Expression> expressions){
//     super(pos, expressions);
//   }
// 
// 
//   @Override
//   public String toString() {
//     StringBuffer buf = new StringBuffer();
//     buf.append("(");
//     buf.append(body.get(0).toString());
//     for(Expression e : body.subList(1,  body.size())){
//       buf.append(" / ");
//       buf.append(e.toString());
//     }
//     buf.append(")");
//     return new String(buf);
//   }
// 
//   @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 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 N_Sequence extends VarArgExpression {
//   public N_Sequence(Position pos, List<Expression> expressions) {
//     super(pos, expressions);
//   }
// 
//   @Override
//   public String toString() {
//     StringBuffer buf = new StringBuffer();
//     buf.append("(");
//     buf.append(body.get(0).toString());
//     for(Expression e : body.subList(1,  body.size())){
//       buf.append(" ");
//       buf.append(e.toString());
//     }
//     buf.append(")");
//     return new String(buf);
//   }
// 
//   @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/util/CollectionUtil.java
// public class CollectionUtil {
//   public static <T> List<T> list(T... elements) {
//     return new ArrayList<T>(Arrays.asList(elements));
//   }
//   
//   public static <A, B> Pair<A, B> t(A fst, B snd) {
//     return new Pair<A, B>(fst, snd);
//   }
//   
//   public static <K, V> Map<K, V> map(Pair<? extends K, ? extends V>... elements) {
//     Map<K, V> map = new HashMap<K, V>();
//     for(Pair<? extends K, ? extends V> e:elements) {
//       map.put(e.fst(), e.snd());
//     }
//     return map;
//   }
//   
//   public static <T> Set<T> set(T... elements) {
//     return new HashSet<T>(Arrays.asList(elements));
//   }
//   
//   public static <T> Set<T> setFrom(Collection<? extends T> collection) {
//     return new HashSet<T>(collection);
//   }
// }


// Path: src/main/java/com/github/kmizu/yapp/translator/ExpressionFlattener.java
import java.util.ArrayList;
import java.util.List;
import com.github.kmizu.yapp.Ast.N_Alternation;
import com.github.kmizu.yapp.Ast.Expression;
import com.github.kmizu.yapp.Ast.Grammar;
import com.github.kmizu.yapp.Ast.N_Sequence;
import static com.github.kmizu.yapp.util.CollectionUtil.*;

package com.github.kmizu.yapp.translator;




public class ExpressionFlattener implements Translator<Grammar, Grammar> {
  private Translator<Grammar, Grammar> f1 = new AbstractGrammarExpander<Void>(){
    @Override
    protected Expression visit(N_Sequence node, Void context) {
      List<Expression> es = node.body();
      List<Expression> result = new ArrayList<Expression>();
      Expression last = es.get(0);
      for(Expression e : es.subList(1, es.size())){
        if(e instanceof N_Alternation){