Skip to content

Latest commit

Β 

History

History
103 lines (95 loc) Β· 2.19 KB

File metadata and controls

103 lines (95 loc) Β· 2.19 KB

Challenges

Representing Code

Challenge 1

Start:

expr β†’ expr ( "(" ( expr ( "," expr )* )? ")" | "." IDENTIFIER )+
     | IDENTIFIER
     | NUMBER

Result:

expr β†’ expr tmp
expr β†’ IDENTIFIER
expr β†’ NUMBER

tmp  β†’  tmp tmp
tmp  β†’  "(" expr ")"
tmp  β†’  "(" expr tmp2 ")"
tmp  β†’  "." IDENTIFIER

tmp2  β†’  tmp2 tmp2
tmp2  β†’  "," expr

Challenge 2

I don't know enough Haskell for this challenge

Challenge 3

Parsing Expressions

Challenge 1a

// in  Parser.java
private Expr comma() {
        Expr expr = ternary();
        if (match(COMMA)) {
            Token operator = previous();
            Expr right = ternary();
            expr = new Expr.Binary(expr, operator, right);
        }
        return expr;
    }

Challenge 1b

// in Parser.java
private Expr comma() {
        Expr expr = ternary();
        if (match(COMMA)) {
            Token operator = previous();
            Expr right = ternary();
            expr = new Expr.Binary(expr, operator, right);
        }
        return expr;
    }

Challenge 2

// in Parser.java
private Expr ternary() {
        Expr expr = equality();
        if (match(QUESTION_MARK)) {
            Expr middle = equality();
            if (match(COLON)) {
                Token ternaryOperator = new Token(TERNARY_CONDITIONAL_OPERATOR, "?:", null, previous().line);
                Expr right = equality();
                return new Expr.Ternary(ternaryOperator, expr, middle, right);
            }
            else {
                throw error(peek(), "Ternary operator missing colon.");
            }
        }
        return expr;
    }
// in Expr.java
static class Ternary extends Expr {
    Ternary(Token operator, Expr left, Expr middle, Expr right) {
      this.operator = operator;
      this.left = left;
      this.middle = middle;
      this.right = right;
    }

    @Override
    <R> R accept(Visitor<R> visitor) {
      return visitor.visitTernaryExpr(this);
    }

    final Token operator;
    final Expr left;
    final Expr middle;
    final Expr right;
  }
// in Expr.java add to Visitor interface
    R visitTernaryExpr(Ternary expr);
  }

Challenge 3