diff --git a/src/main/antlr/Decaf.g4 b/src/main/antlr/Decaf.g4 index 547838e..9812e82 100644 --- a/src/main/antlr/Decaf.g4 +++ b/src/main/antlr/Decaf.g4 @@ -6,7 +6,7 @@ class : PUBLIC? 'class' id '{' (field | meth)* '}'; field : type id ';'; localVar : type id ';'; -assignSign : '=' | '+=' | '-=' | '*='; +assignSign : ASSIGN | ADD_ASSIGN | SUB_ASSIGN | MUL_ASSIGN; returntype : type | VOID; type : INT | BOOL | CHAR; @@ -26,11 +26,11 @@ stmt : 'if' '(' expr ')' block ('else' block)? #If | 'return' ';' #ReturnVoid | 'break' ';' #Break | 'continue' ';' #Continue - | stmtexpr #StatementExpressionstmt + | id assignSign expr ';' #Assignment + | stmtexpr ';' #StatementExpressionstmt ; -stmtexpr : id assignSign expr ';' #Assignment - | methCall ';' #MethodCall +stmtexpr : methCall #MethodCall | NEW type '(' args? ')' #New ; @@ -38,7 +38,6 @@ expr : expr binaryOp expr #BinaryOperation | unaryOp expr #UnaryOperation | literal #Constant | '(' expr ')' #Expression - | methCall #MethodCallExpression | fieldId #Identifier | stmtexpr #StatementExpressionexpr | NULL #Null @@ -75,6 +74,11 @@ NE : '!='; AND : '&&'; OR : '||'; +ASSIGN : '='; +ADD_ASSIGN : '+='; +SUB_ASSIGN : '-='; +MUL_ASSIGN : '*='; + NOT : '!'; INT : 'int'; diff --git a/src/main/java/de/maishai/ExpressionGenerator.java b/src/main/java/de/maishai/ExpressionGenerator.java index d9e1698..da842f9 100644 --- a/src/main/java/de/maishai/ExpressionGenerator.java +++ b/src/main/java/de/maishai/ExpressionGenerator.java @@ -46,9 +46,9 @@ public class ExpressionGenerator extends DecafBaseVisitor { public static Expression generateConstant(DecafParser.LiteralContext ctx){ if(ctx.NUMBER() != null) - return new IntConstant(Integer.valueOf(ctx.NUMBER().getText())); + return new IntLiteral(Integer.valueOf(ctx.NUMBER().getText())); if(ctx.boolean_() != null) - return new BoolConstant(Boolean.valueOf(ctx.boolean_().getText())); + return new BoolLiteral(Boolean.valueOf(ctx.boolean_().getText())); throw new RuntimeException(); } diff --git a/src/main/java/de/maishai/ast/AssignSign.java b/src/main/java/de/maishai/ast/AssignSign.java new file mode 100644 index 0000000..98830a9 --- /dev/null +++ b/src/main/java/de/maishai/ast/AssignSign.java @@ -0,0 +1,8 @@ +package de.maishai.ast; + +public enum AssignSign { + ASSIGN, + ADD_ASSIGN, + SUB_ASSIGN, + MUL_ASSIGN, +} diff --git a/src/main/java/de/maishai/ast/records/Assignment.java b/src/main/java/de/maishai/ast/records/Assignment.java index 3af8b5e..832b1b1 100644 --- a/src/main/java/de/maishai/ast/records/Assignment.java +++ b/src/main/java/de/maishai/ast/records/Assignment.java @@ -1,5 +1,7 @@ package de.maishai.ast.records; -public record Assignment(Id loc, Expression value) implements Statement, Expression { +import de.maishai.ast.AssignSign; + +public record Assignment(Id loc, AssignSign assignment, Expression value) implements Statement { } diff --git a/src/main/java/de/maishai/ast/records/BoolConstant.java b/src/main/java/de/maishai/ast/records/BoolConstant.java deleted file mode 100644 index 1e4e7a3..0000000 --- a/src/main/java/de/maishai/ast/records/BoolConstant.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.maishai.ast.records; - - -public record BoolConstant(Boolean value) implements Expression { -} diff --git a/src/main/java/de/maishai/ast/records/BoolLiteral.java b/src/main/java/de/maishai/ast/records/BoolLiteral.java new file mode 100644 index 0000000..f09b222 --- /dev/null +++ b/src/main/java/de/maishai/ast/records/BoolLiteral.java @@ -0,0 +1,5 @@ +package de.maishai.ast.records; + + +public record BoolLiteral(Boolean value) implements Expression { +} diff --git a/src/main/java/de/maishai/ast/records/CharConstant.java b/src/main/java/de/maishai/ast/records/CharConstant.java deleted file mode 100644 index ad2c671..0000000 --- a/src/main/java/de/maishai/ast/records/CharConstant.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.maishai.ast.records; - - -public record CharConstant(char value) implements Expression { -} diff --git a/src/main/java/de/maishai/ast/records/CharLiteral.java b/src/main/java/de/maishai/ast/records/CharLiteral.java new file mode 100644 index 0000000..af8454c --- /dev/null +++ b/src/main/java/de/maishai/ast/records/CharLiteral.java @@ -0,0 +1,5 @@ +package de.maishai.ast.records; + + +public record CharLiteral(char value) implements Expression { +} diff --git a/src/main/java/de/maishai/ast/records/Class.java b/src/main/java/de/maishai/ast/records/Class.java index 7f24d30..87d106c 100644 --- a/src/main/java/de/maishai/ast/records/Class.java +++ b/src/main/java/de/maishai/ast/records/Class.java @@ -2,5 +2,5 @@ package de.maishai.ast.records; import java.util.List; -public record Class(Id id , List variables, List methods) implements Node { +public record Class(Id id , List fields, List methods) implements Node { } diff --git a/src/main/java/de/maishai/ast/records/Constructor.java b/src/main/java/de/maishai/ast/records/Constructor.java new file mode 100644 index 0000000..4280e93 --- /dev/null +++ b/src/main/java/de/maishai/ast/records/Constructor.java @@ -0,0 +1,6 @@ +package de.maishai.ast.records; + +import java.util.List; + +public record Constructor(Id id, List params, Block block) { +} diff --git a/src/main/java/de/maishai/ast/records/Expression.java b/src/main/java/de/maishai/ast/records/Expression.java index 815e7f9..3035ea5 100644 --- a/src/main/java/de/maishai/ast/records/Expression.java +++ b/src/main/java/de/maishai/ast/records/Expression.java @@ -1,5 +1,5 @@ package de.maishai.ast.records; -public sealed interface Expression extends Node permits Assignment, Binary, BoolConstant, CharConstant, Id, IntConstant, MethodCall, New { +public sealed interface Expression extends Node permits Binary, BoolLiteral, CharLiteral, Id, IntLiteral, MethodCall, New { } diff --git a/src/main/java/de/maishai/ast/records/FieldId.java b/src/main/java/de/maishai/ast/records/FieldId.java new file mode 100644 index 0000000..55ced16 --- /dev/null +++ b/src/main/java/de/maishai/ast/records/FieldId.java @@ -0,0 +1,4 @@ +package de.maishai.ast.records; + +public record FieldId(Boolean field, Expression recipient, Id id) { +} diff --git a/src/main/java/de/maishai/ast/records/IntConstant.java b/src/main/java/de/maishai/ast/records/IntConstant.java deleted file mode 100644 index 2724a49..0000000 --- a/src/main/java/de/maishai/ast/records/IntConstant.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.maishai.ast.records; - - -public record IntConstant(Integer value) implements Expression { -} diff --git a/src/main/java/de/maishai/ast/records/IntLiteral.java b/src/main/java/de/maishai/ast/records/IntLiteral.java new file mode 100644 index 0000000..7b5c234 --- /dev/null +++ b/src/main/java/de/maishai/ast/records/IntLiteral.java @@ -0,0 +1,5 @@ +package de.maishai.ast.records; + + +public record IntLiteral(Integer value) implements Expression { +} diff --git a/src/main/java/de/maishai/ast/records/MethodCall.java b/src/main/java/de/maishai/ast/records/MethodCall.java index 755e224..15f7d4d 100644 --- a/src/main/java/de/maishai/ast/records/MethodCall.java +++ b/src/main/java/de/maishai/ast/records/MethodCall.java @@ -1,8 +1,6 @@ package de.maishai.ast.records; - - import java.util.List; -public record MethodCall(Id id, List args) implements Expression, Statement { +public record MethodCall(Boolean field, Expression recipient, Id id, List args) implements Expression, Statement { } diff --git a/src/main/java/de/maishai/ast/records/Node.java b/src/main/java/de/maishai/ast/records/Node.java index e088d11..9e6d51c 100644 --- a/src/main/java/de/maishai/ast/records/Node.java +++ b/src/main/java/de/maishai/ast/records/Node.java @@ -1,4 +1,4 @@ package de.maishai.ast.records; -public sealed interface Node permits Expression, Statement, Block, Class, MainMethod, Method, Parameter, Program, Variable { +public sealed interface Node permits Block, Class, Expression, LocalVariable, MainMethod, Method, Parameter, Program, Statement { } diff --git a/src/main/java/de/maishai/ast/records/Statement.java b/src/main/java/de/maishai/ast/records/Statement.java index 9351511..a776dc9 100644 --- a/src/main/java/de/maishai/ast/records/Statement.java +++ b/src/main/java/de/maishai/ast/records/Statement.java @@ -12,5 +12,5 @@ import de.maishai.ast.records.Return; import de.maishai.ast.records.ReturnVoid; import de.maishai.ast.records.While; -public sealed interface Statement extends Node permits Break, Continue, DoWhile, For, IfElse, MethodCall, New, Return, ReturnVoid, While { +public sealed interface Statement extends Node permits Assignment, Break, Continue, DoWhile, For, IfElse, MethodCall, New, Return, ReturnVoid, While { }