diff --git a/parser/src/main/java/com/compilerprogramming/ezlang/parser/AST.java b/parser/src/main/java/com/compilerprogramming/ezlang/parser/AST.java index aa21c76..969625d 100644 --- a/parser/src/main/java/com/compilerprogramming/ezlang/parser/AST.java +++ b/parser/src/main/java/com/compilerprogramming/ezlang/parser/AST.java @@ -372,9 +372,14 @@ public void accept(ASTVisitor visitor) { public static class ArrayIndexExpr extends Expr { public final Expr array; public final Expr expr; + public final boolean loading; public ArrayIndexExpr(Expr array, Expr expr) { + this(array, expr, true); + } + public ArrayIndexExpr(Expr array, Expr expr, boolean loading) { this.array = array; this.expr = expr; + this.loading = loading; } @Override public StringBuilder toStr(StringBuilder sb) { @@ -398,9 +403,14 @@ public void accept(ASTVisitor visitor) { public static class FieldExpr extends Expr { public final Expr object; public final String fieldName; + public final boolean loading; public FieldExpr(Expr object, String fieldName) { + this(object, fieldName, true); + } + public FieldExpr(Expr object, String fieldName, boolean loading) { this.object = object; this.fieldName = fieldName; + this.loading = loading; } @Override public StringBuilder toStr(StringBuilder sb) { diff --git a/parser/src/main/java/com/compilerprogramming/ezlang/parser/Parser.java b/parser/src/main/java/com/compilerprogramming/ezlang/parser/Parser.java index ca9deb9..97f36fc 100644 --- a/parser/src/main/java/com/compilerprogramming/ezlang/parser/Parser.java +++ b/parser/src/main/java/com/compilerprogramming/ezlang/parser/Parser.java @@ -246,7 +246,19 @@ private AST.Stmt parseAssign(Lexer lexer) { testPunctuation(lexer, ";"); if (rhs == null) return new AST.ExprStmt(lhs); - return new AST.AssignStmt(lhs, rhs); + return new AST.AssignStmt(storing(lhs), rhs); + } + + private AST.Expr storing(AST.Expr lhs) { + if (lhs instanceof AST.ArrayIndexExpr arrayIndexExpr && + arrayIndexExpr.loading) { + return new AST.ArrayIndexExpr(arrayIndexExpr.array, arrayIndexExpr.expr, false); + } + else if (lhs instanceof AST.FieldExpr fieldExpr && + fieldExpr.loading) { + return new AST.FieldExpr(fieldExpr.object, fieldExpr.fieldName, false); + } + return lhs; } private AST.Expr parseBool(Lexer lexer) {