001 import sexp.SEmpty;
002 import sexp.SExp;
003 import sexp.SExpVisitor;
004 import sexp.SList;
005 import sexp.SNonEmpty;
006 import sexp.SString;
007 import sexp.SSymbol;
008
009
010
011 public class SExpUtil {
012
013 public static SList append(SList l1, SList l2) {
014 if (l1.isEmpty()) return l2;
015 else return new SNonEmpty(l1.first(), append(l1.rest(), l2));
016 }
017
018 public static SList flatten(SExp sexp) {
019 return sexp.accept(new SExpVisitor<SList>() {
020 public SList visit(SList sexp) {
021 if (sexp.isEmpty()) return sexp;
022 return append(sexp.first().accept(this), sexp.rest().accept(this));
023 }
024
025 public SList visit(SString sexp) {
026 return new SNonEmpty(sexp, new SEmpty());
027 }
028
029 public SList visit(SSymbol sexp) {
030 return new SNonEmpty(sexp, new SEmpty());
031 }
032
033 });
034 }
035 }