implement variable assignment
This commit is contained in:
@@ -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: '+';
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user