implement variable assignment

This commit is contained in:
2019-11-18 18:54:24 +01:00
parent b38369b7a5
commit 2af9f369cf
6 changed files with 53 additions and 3 deletions

View File

@@ -5,7 +5,7 @@ parse
; ;
program program
: functionDef* expression : functionDef* expression SCOL
; ;
functionDef functionDef
@@ -23,6 +23,7 @@ braced_block
statement statement
: print : print
| if_statement | if_statement
| variable_assignment
; ;
print print
@@ -33,6 +34,10 @@ if_statement
: IF OPAR cond = expression CPAR then = braced_block (ELSE (alt = braced_block | elif = if_statement) )? : IF OPAR cond = expression CPAR then = braced_block (ELSE (alt = braced_block | elif = if_statement) )?
; ;
variable_assignment
: IDENT EQUAL expression SCOL
;
expression expression
: atom MULT atom #multiplicationExpression : atom MULT atom #multiplicationExpression
| atom op=(ADD | SUB) atom #additiveExpression | atom op=(ADD | SUB) atom #additiveExpression
@@ -43,7 +48,7 @@ expression
; ;
functionCall functionCall
: IDENT OPAR arguments CPAR SCOL : IDENT OPAR arguments CPAR
; ;
arguments arguments
@@ -66,6 +71,7 @@ CBRK: '}';
OPAR: '('; OPAR: '(';
CPAR: ')'; CPAR: ')';
COMMA: ','; COMMA: ',';
EQUAL: '=';
MULT: '*'; MULT: '*';
ADD: '+'; ADD: '+';

View File

@@ -52,6 +52,13 @@ public class ContextAnalysis extends KlangBaseVisitor<Node> {
} }
} }
@Override
public Node visitVariable_assignment(KlangParser.Variable_assignmentContext ctx) {
String name = ctx.IDENT().getText();
Expression expression = (Expression) this.visit(ctx.expression());
return new VariableAssignment(name, expression);
}
@Override @Override
public Node visitMultiplicationExpression(KlangParser.MultiplicationExpressionContext ctx) { public Node visitMultiplicationExpression(KlangParser.MultiplicationExpressionContext ctx) {
Node left = this.visit(ctx.atom(0)); Node left = this.visit(ctx.atom(0));

View File

@@ -0,0 +1,21 @@
package de.hsrm.compiler.Klang.nodes.statements;
import de.hsrm.compiler.Klang.nodes.expressions.Expression;
import de.hsrm.compiler.Klang.visitors.Visitor;
public class VariableAssignment extends Statement {
public String name;
public Expression expression;
public VariableAssignment(String name, Expression expression) {
this.name = name;
this.expression = expression;
}
@Override
public <R> R welcome(Visitor<R> v) {
return v.visit(this);
}
}

View File

@@ -85,6 +85,13 @@ public class EvalVisitor implements Visitor<Value> {
return null; return null;
} }
@Override
public Value visit(VariableAssignment e) {
Value result = e.expression.welcome(this);
this.env.put(e.name, result);
return result;
}
@Override @Override
public Value visit(Block e) { public Value visit(Block e) {
Value result = null; Value result = null;

View File

@@ -125,6 +125,14 @@ public class PrettyPrintVisitor implements Visitor<Void> {
return null; return null;
} }
@Override
public Void visit(VariableAssignment e) {
ex.write(e.name + " = ");
e.expression.welcome(this);
ex.write(";");
return null;
}
@Override @Override
public Void visit(Block e) { public Void visit(Block e) {
ex.write("{"); ex.write("{");
@@ -171,7 +179,7 @@ public class PrettyPrintVisitor implements Visitor<Void> {
} }
arg.welcome(this); arg.welcome(this);
} }
ex.write(");"); ex.write(")");
return null; return null;
} }

View File

@@ -15,6 +15,7 @@ public interface Visitor<R> {
R visit(ModuloExpression e); R visit(ModuloExpression e);
R visit(IfStatement e); R visit(IfStatement e);
R visit(PrintStatement e); R visit(PrintStatement e);
R visit(VariableAssignment e);
R visit(Block e); R visit(Block e);
R visit(FunctionDefinition e); R visit(FunctionDefinition e);
R visit(FunctionCall e); R visit(FunctionCall e);