Skip to content

Commit

Permalink
move expressions to individual files, add pervasives, interpreter
Browse files Browse the repository at this point in the history
  • Loading branch information
oconnor0 committed Apr 2, 2012
1 parent 85ac5c3 commit 549f92f
Show file tree
Hide file tree
Showing 23 changed files with 447 additions and 216 deletions.
5 changes: 5 additions & 0 deletions zero-compiler/pom.xml
Expand Up @@ -19,6 +19,11 @@
<artifactId>guava</artifactId>
<version>11.0.2</version>
</dependency>
<dependency>
<groupId>org.functionaljava</groupId>
<artifactId>functionaljava</artifactId>
<version>3.0</version>
</dependency>
</dependencies>

<build>
Expand Down
5 changes: 4 additions & 1 deletion zero-compiler/src/main/java/zero/compiler/Main.java
Expand Up @@ -5,8 +5,9 @@
import java.io.InputStream;
import java.io.FileInputStream;

import zero.lang.Version;
import zero.lang.*;
import zero.compiler.parser.*;
import zero.interp.ast.*;

public final class Main {
static final Console C = System.console();
Expand All @@ -16,6 +17,8 @@ public final class Main {
public static void main(final String[] args) throws Exception {
C.printf(welcome());

Scope scope = Pervasives.addAll(Scope.EMPTY);

if(args.length > 0) {
for(final String file : args) {
final Expression expr = read(new FileInputStream(file));
Expand Down
@@ -0,0 +1,9 @@
/* Copyright (C) 2012 Matt O'Connor <thegreendragon@gmail.com> */
package zero.compiler.parser;

public abstract class AExpression implements Expression {
@Override
public String toString() {
return toString(new StringBuilder()).toString();
}
}
@@ -0,0 +1,30 @@
/* Copyright (C) 2012 Matt O'Connor <thegreendragon@gmail.com> */
package zero.compiler.parser;

public class ApplyExpression extends AExpression {
public final Expression fn;
public final Expression[] params;

public ApplyExpression(final Expression fn, final Expression... params) {
this.fn = fn;
this.params = params == null ? new Expression[0] : params;
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
b.append("((");
fn.toString(b);
b.append(')');
for(final Expression param : params) {
b.append(' ');
param.toString(b);
}
b.append(')');
return b;
}
}
@@ -0,0 +1,30 @@
/* Copyright (C) 2012 Matt O'Connor <thegreendragon@gmail.com> */
package zero.compiler.parser;

public class CaseExpression extends AExpression {
public final PatternExpression bind;
public final Expression result;

public CaseExpression(final PatternExpression bind, final Expression result) {
this.bind = bind;
this.result = result;
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
if(bind.isWildcard()) {
b.append("else ");
} else {
b.append("| ");
bind.toString(b);
b.append(" -> ");
}
result.toString(b);
return b;
}
}
203 changes: 0 additions & 203 deletions zero-compiler/src/main/java/zero/compiler/parser/Expression.java
Expand Up @@ -5,206 +5,3 @@ public interface Expression {
<R, C> R accept(ExpressionVisitor<R, C> v, C c);
StringBuilder toString(StringBuilder b);
}

abstract class AExpression implements Expression {
@Override
public String toString() {
return toString(new StringBuilder()).toString();
}
}

class NameExpression extends AExpression {
final String name;

public NameExpression(final Token token) {
this.name = token.getText();
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
return b.append(name);
}
}

class IntegerExpression extends AExpression {
final int val;

public IntegerExpression(final Token token) {
this.val = Integer.parseInt(token.getText());
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
return b.append(val);
}
}

class ValDeclExpression extends AExpression {
private final NameExpression name;
private final Expression val;

public ValDeclExpression(final NameExpression name, final Expression val) {
this.name = name;
this.val = val;
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
b.append("val ");
name.toString(b);
b.append(" = ");
val.toString(b);
return b;
}
}

class FnExpression extends AExpression {
private final NameExpression[] params;
private final Expression body;

public FnExpression(final Expression body, final NameExpression... params) {
this.params = params == null ? new NameExpression[0] : params;
this.body = body;
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
b.append("fn ");
for(final NameExpression name : params) {
name.toString(b).append(' ');
}
b.append("-> ");
body.toString(b);
return b;
}
}

class ApplyExpression extends AExpression {
private final Expression fn;
private final Expression[] params;

public ApplyExpression(final Expression fn, final Expression... params) {
this.fn = fn;
this.params = params == null ? new Expression[0] : params;
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
b.append("((");
fn.toString(b);
b.append(')');
for(final Expression param : params) {
b.append(' ');
param.toString(b);
}
b.append(')');
return b;
}
}

class MatchExpression extends AExpression {
private final Expression val;
private final CaseExpression[] cases;

public MatchExpression(final Expression val, final CaseExpression... cases) {
this.val = val;
this.cases = cases == null ? new CaseExpression[0] : cases;
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
b.append("match ");
val.toString(b);
b.append(" with ");
for(final CaseExpression c : cases) {
c.toString(b);
b.append(' ');
}
b.append("end");
return b;
}
}

class CaseExpression extends AExpression {
private final PatternExpression bind;
private final Expression result;

public CaseExpression(final PatternExpression bind, final Expression result) {
this.bind = bind;
this.result = result;
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
if(bind.isWildcard()) {
b.append("else ");
} else {
b.append("| ");
bind.toString(b);
b.append(" -> ");
}
result.toString(b);
return b;
}
}

class PatternExpression extends AExpression {
public static final PatternExpression WILDCARD = new PatternExpression(new NameExpression(new Token(Token.Type.NAME, "_")));

private final Expression pattern;

public PatternExpression(final Expression pattern) {
this.pattern = pattern;
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
pattern.toString(b);
return b;
}

public boolean isWildcard() {
return pattern.getClass() == NameExpression.class
&& ((NameExpression) pattern).name.equals("_");
}
}
28 changes: 28 additions & 0 deletions zero-compiler/src/main/java/zero/compiler/parser/FnExpression.java
@@ -0,0 +1,28 @@
/* Copyright (C) 2012 Matt O'Connor <thegreendragon@gmail.com> */
package zero.compiler.parser;

public class FnExpression extends AExpression {
public final NameExpression[] params;
public final Expression body;

public FnExpression(final Expression body, final NameExpression... params) {
this.params = params == null ? new NameExpression[0] : params;
this.body = body;
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
b.append("fn ");
for(final NameExpression name : params) {
name.toString(b).append(' ');
}
b.append("-> ");
body.toString(b);
return b;
}
}
@@ -0,0 +1,20 @@
/* Copyright (C) 2012 Matt O'Connor <thegreendragon@gmail.com> */
package zero.compiler.parser;

public class IntegerExpression extends AExpression {
public final int val;

public IntegerExpression(final Token token) {
this.val = Integer.parseInt(token.getText());
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
return b.append(val);
}
}
@@ -0,0 +1,30 @@
/* Copyright (C) 2012 Matt O'Connor <thegreendragon@gmail.com> */
package zero.compiler.parser;

public class MatchExpression extends AExpression {
public final Expression val;
public final CaseExpression[] cases;

public MatchExpression(final Expression val, final CaseExpression... cases) {
this.val = val;
this.cases = cases == null ? new CaseExpression[0] : cases;
}

@Override
public <R, C> R accept(ExpressionVisitor<R, C> v, C c) {
return v.visit(this, c);
}

@Override
public StringBuilder toString(final StringBuilder b) {
b.append("match ");
val.toString(b);
b.append(" with ");
for(final CaseExpression c : cases) {
c.toString(b);
b.append(' ');
}
b.append("end");
return b;
}
}

0 comments on commit 549f92f

Please sign in to comment.