diff --git a/native-build.sh b/native-build.sh new file mode 100755 index 0000000..7f29e24 --- /dev/null +++ b/native-build.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +BUILD_NATIVE_DIR="build-native" +CLASSPATH="../lib/antlr-4.7-complete.jar:.:../build-tile" # use forward slashes on Linux + +mkdir -p "$BUILD_NATIVE_DIR" +cd "$BUILD_NATIVE_DIR" + +NATIVE_IMAGE="/home/yasinxdxd/.sdkman/candidates/java/current/bin/native-image" + +# Optional: print what you're doing +echo "Using native-image from: $NATIVE_IMAGE" +echo "Using classpath: $CLASSPATH" + +# Run native-image +"$NATIVE_IMAGE" \ + -H:+UnlockExperimentalVMOptions \ + -H:-CheckToolchain \ + -cp "$CLASSPATH" \ + tile.app.Tile \ + -o "tile" diff --git a/src/tile/AntlrToExpression.java b/src/tile/AntlrToExpression.java index 28531ef..d6106e0 100644 --- a/src/tile/AntlrToExpression.java +++ b/src/tile/AntlrToExpression.java @@ -643,10 +643,16 @@ public Expression visitObjectLiteralExpression(ObjectLiteralExpressionContext ct @Override public Expression visitObjectAccessor(ObjectAccessorContext ctx) { - String identifier = ctx.IDENTIFIER(0).getText(); + String identifier; StringBuilder varType = new StringBuilder(); int tasmIdx = -1; AtomicBoolean isGlobal = new AtomicBoolean(false); + if (ctx.arrayIndexAccessor() != null) { + identifier = ctx.arrayIndexAccessor().IDENTIFIER().getText(); + } else { + identifier = ctx.IDENTIFIER(0).getText(); + } + try { tasmIdx = TasmSymbolGenerator.identifierScopeFind(identifier, varType, isGlobal); // TODO: use isGlobal!!! @@ -660,34 +666,67 @@ public Expression visitObjectAccessor(ObjectAccessorContext ctx) { TypeDefinition td = TypeResolver.userTypeDefs.get(type); - if (ctx.objectAccessor() == null) { - String fieldId = ctx.IDENTIFIER(1).getText(); - if (td != null) { - td.getFields().get(fieldId); - if (td.getFields().get(fieldId) == null) { - int line = ctx.IDENTIFIER(1).getSymbol().getLine(); - int col = ctx.IDENTIFIER(1).getSymbol().getCharPositionInLine(); - Log.error(line + ":" + col + ": '" + identifier + ": " + type + "'' doesn't have a field " + fieldId + "!"); + if (ctx.arrayIndexAccessor() != null) { + if (ctx.objectAccessor() == null) { + String fieldId = ctx.IDENTIFIER(0).getText(); + if (td != null) { + td.getFields().get(fieldId); + if (td.getFields().get(fieldId) == null) { + int line = ctx.IDENTIFIER(0).getSymbol().getLine(); + int col = ctx.IDENTIFIER(0).getSymbol().getCharPositionInLine(); + Log.error(line + ":" + col + ": '" + identifier + ": " + type + "'' doesn't have a field " + fieldId + "!"); + } + } else { + Log.error("NOT IMPLEMENTED!"); } - } - ObjectAccessor oa = new ObjectAccessor(fieldId, td, tasmIdx, null); - if (isGlobal.get() == true) { - oa.setAsGlobal(); - } + ObjectAccessor oa = new ObjectAccessor(fieldId, td, tasmIdx, null); + if (isGlobal.get() == true) { + oa.setAsGlobal(); + } - return oa; - } else { - - ObjectAccessor accessor = (ObjectAccessor)visit(ctx.objectAccessor()); + return oa; + } else { + ObjectAccessor accessor = (ObjectAccessor)visit(ctx.objectAccessor()); + + ObjectAccessor oa = new ObjectAccessor(null, td, tasmIdx, accessor); + if (isGlobal.get() == true) { + oa.setAsGlobal(); + } - ObjectAccessor oa = new ObjectAccessor(null, td, tasmIdx, accessor); - if (isGlobal.get() == true) { - oa.setAsGlobal(); + return oa; } + } else { + if (ctx.objectAccessor() == null) { + String fieldId = ctx.IDENTIFIER(1).getText(); + if (td != null) { + td.getFields().get(fieldId); + if (td.getFields().get(fieldId) == null) { + int line = ctx.IDENTIFIER(1).getSymbol().getLine(); + int col = ctx.IDENTIFIER(1).getSymbol().getCharPositionInLine(); + Log.error(line + ":" + col + ": '" + identifier + ": " + type + "'' doesn't have a field " + fieldId + "!"); + } + } + + ObjectAccessor oa = new ObjectAccessor(fieldId, td, tasmIdx, null); + if (isGlobal.get() == true) { + oa.setAsGlobal(); + } + + return oa; + } else { + + ObjectAccessor accessor = (ObjectAccessor)visit(ctx.objectAccessor()); - return oa; - } + ObjectAccessor oa = new ObjectAccessor(null, td, tasmIdx, accessor); + if (isGlobal.get() == true) { + oa.setAsGlobal(); + } + + return oa; + } + } + } } diff --git a/src/tile/AntlrToStatement.java b/src/tile/AntlrToStatement.java index e009f6e..d0ee5d9 100644 --- a/src/tile/AntlrToStatement.java +++ b/src/tile/AntlrToStatement.java @@ -310,10 +310,10 @@ public Statement visitTypeDefinition(TypeDefinitionContext ctx) { String typeName = ctx.IDENTIFIER().getText(); HashMap fields = null; TypeDefinition.Kind kind = null; + int offset = 0; if (ctx.structDefinition() != null) { fields = new HashMap<>(); kind = TypeDefinition.Kind.STRUCT; - int offset = 0; for (int i = 0; i < ctx.structDefinition().fieldDefinition().size(); i++) { String id = ctx.structDefinition().fieldDefinition(i).IDENTIFIER().getText(); String type = ctx.structDefinition().fieldDefinition(i).typeName().getText(); @@ -330,7 +330,7 @@ public Statement visitTypeDefinition(TypeDefinitionContext ctx) { } } - TypeDefinition td = new TypeDefinition(typeName, kind, fields); + TypeDefinition td = new TypeDefinition(typeName, kind, fields, offset); TypeResolver.userTypeDefs.put(typeName, td); return td; } diff --git a/src/tile/ast/stmt/TypeDefinition.java b/src/tile/ast/stmt/TypeDefinition.java index 315c5c2..6449555 100644 --- a/src/tile/ast/stmt/TypeDefinition.java +++ b/src/tile/ast/stmt/TypeDefinition.java @@ -13,6 +13,7 @@ public enum Kind { public String typeName; public Kind kind; + public int size; public static class Field { public String id; @@ -31,10 +32,11 @@ public Field(String id, String type, int type_size, int offset) { private HashMap fields; // for struct private List variants; // for union - public TypeDefinition(String typeName, Kind kind, HashMap fields) { + public TypeDefinition(String typeName, Kind kind, HashMap fields, int size) { this.typeName = typeName; this.kind = kind; this.fields = fields; + this.size = size; } @Override diff --git a/src/tile/ast/types/TypeResolver.java b/src/tile/ast/types/TypeResolver.java index ae3d24e..aebfe66 100644 --- a/src/tile/ast/types/TypeResolver.java +++ b/src/tile/ast/types/TypeResolver.java @@ -167,7 +167,9 @@ private static int resolveArrayTypeSize(String type) { } // composite type - // FIXME: + if (isUserDefinedType(type)) { + return userTypeDefs.get(type).size; + } return -1; } @@ -182,7 +184,9 @@ public static int resolveFieldTypeSize(String type) { } // composite type - // FIXME: + if (isUserDefinedType(type)) { + return userTypeDefs.get(type).size; + } return -1; } diff --git a/tileParser.g4 b/tileParser.g4 index fe839e8..fc0f038 100644 --- a/tileParser.g4 +++ b/tileParser.g4 @@ -91,6 +91,8 @@ objectLiteralFieldAssignment objectAccessor : IDENTIFIER '.' IDENTIFIER | IDENTIFIER '.' objectAccessor + | arrayIndexAccessor '.' IDENTIFIER + | arrayIndexAccessor '.' objectAccessor ; unaryExpression @@ -122,7 +124,7 @@ arrayValuedInitializerElements ; arraySizedInitializer - : primaryTypeName arraySizeSpecifier+ + : arraySizeSpecifier+ primaryTypeName ; arraySizeSpecifier @@ -306,7 +308,7 @@ tasmBlock ; tasmInstructions - : (tasmLine)? (PUNC_COMMA tasmLine)* + : (tasmLine)? PUNC_COMMA? (PUNC_COMMA tasmLine)* PUNC_COMMA? ; tasmLine