package expressions; import java.util.Set; import common.prettyprinter.PrettyStringBuilder; import expressions.annotation.SyntacticSugar; /** * Represents an expression for sequential execution * of commands, <code>e1;e2</code>. * * @author Benedikt Meurer * @version $Id$ */ @SyntacticSugar public final class Sequence extends Expression { // // Attributes // /** * The first expression. */ private Expression e1; /** * The second expression. */ private Expression e2; // // Constructor // /** * Allocates a new sequence with the given expressions * <code>e1</code> and <code>e2</code>. * * @param e1 the first expression. * @param e2 the second expression. */ public Sequence(Expression e1, Expression e2) { this.e1 = e1; this.e2 = e2; } // // Accessors // /** * @return Returns the e1. */ public Expression getE1() { return this.e1; } /** * @return Returns the e2. */ public Expression getE2() { return this.e2; } // // Primitives // /** * {@inheritDoc} * * @see expressions.Expression#translateSyntacticSugar() */ @Override public Expression translateSyntacticSugar() { // determine a new unique identifier String id = "u"; Set<String> freeE1 = this.e1.free(); Set<String> freeE2 = this.e2.free(); while (freeE1.contains(id) || freeE2.contains(id)) { id = id + "'"; } // translate to "let id = e1 in e2" return new Let(id, this.e1, this.e2); } /** * {@inheritDoc} * * @see expressions.Expression#substitute(java.lang.String, expressions.Expression) */ @Override public Expression substitute(String id, Expression e) { return new Sequence(this.e1.substitute(id, e), this.e2.substitute(id, e)); } /** * {@inheritDoc} * * @see expressions.Expression#toPrettyStringBuilder() */ @Override protected PrettyStringBuilder toPrettyStringBuilder() { PrettyStringBuilder builder = new PrettyStringBuilder(this, 0); builder.appendBuilder(this.e1.toPrettyStringBuilder(), 1); builder.appendText("; "); builder.appendBuilder(this.e2.toPrettyStringBuilder(), 0); return builder; } }