binary operations work now

This commit is contained in:
dfsek
2020-12-21 02:01:42 -07:00
parent adc5f0becc
commit 8a7499d874
11 changed files with 109 additions and 25 deletions

View File

@@ -2,14 +2,19 @@ package com.dfsek.terra.api.structures.parser;
import com.dfsek.terra.api.structures.parser.exceptions.ParseException;
import com.dfsek.terra.api.structures.parser.lang.Block;
import com.dfsek.terra.api.structures.parser.lang.ConstantExpression;
import com.dfsek.terra.api.structures.parser.lang.Item;
import com.dfsek.terra.api.structures.parser.lang.Keyword;
import com.dfsek.terra.api.structures.parser.lang.Returnable;
import com.dfsek.terra.api.structures.parser.lang.constants.BooleanConstant;
import com.dfsek.terra.api.structures.parser.lang.constants.NumericConstant;
import com.dfsek.terra.api.structures.parser.lang.constants.StringConstant;
import com.dfsek.terra.api.structures.parser.lang.functions.Function;
import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword;
import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation;
import com.dfsek.terra.api.structures.parser.lang.operations.BooleanNotOperation;
import com.dfsek.terra.api.structures.parser.lang.operations.ConcatenationOperation;
import com.dfsek.terra.api.structures.parser.lang.operations.NumberAdditionOperation;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.structures.tokenizer.Token;
import com.dfsek.terra.api.structures.tokenizer.Tokenizer;
@@ -100,17 +105,53 @@ public class Parser {
Returnable<?> expression;
if(tokens.get(0).isConstant()) {
Object constant;
Position position = tokens.get(0).getPosition();
if(tokens.get(0).getType().equals(Token.Type.BOOLEAN)) constant = Boolean.parseBoolean(tokens.remove(0).getContent());
else constant = tokens.remove(0).getContent();
expression = new ConstantExpression<>(constant, position);
Token constantToken = tokens.remove(0);
Position position = constantToken.getPosition();
switch(constantToken.getType()) {
case NUMBER:
String content = constantToken.getContent();
expression = new NumericConstant(content.contains(".") ? Double.parseDouble(content) : Integer.parseInt(content), position);
break;
case STRING:
expression = new StringConstant(constantToken.getContent(), position);
break;
case BOOLEAN:
expression = new BooleanConstant(Boolean.parseBoolean(constantToken.getContent()), position);
break;
default:
throw new UnsupportedOperationException("Unsupported constant token: " + constantToken.getType() + " at position: " + position);
}
} else expression = parseFunction(tokens, false);
if(not) {
checkReturnType(expression, Returnable.ReturnType.BOOLEAN);
return new BooleanNotOperation((Returnable<Boolean>) expression, expression.getPosition());
} else return expression;
expression = new BooleanNotOperation((Returnable<Boolean>) expression, expression.getPosition());
}
if(tokens.get(0).isBinaryOperator()) return parseBinaryOperation(expression, tokens);
return expression;
}
@SuppressWarnings("unchecked")
private BinaryOperation<?> parseBinaryOperation(Returnable<?> left, List<Token> tokens) throws ParseException {
Token binaryOperator = tokens.remove(0);
Returnable<?> right = parseExpression(tokens);
switch(binaryOperator.getType()) {
case ADDITION_OPERATOR:
System.out.println(left.returnType());
System.out.println(right.returnType());
if(left.returnType().equals(Returnable.ReturnType.NUMBER) && right.returnType().equals(Returnable.ReturnType.NUMBER)) {
System.out.println("number " + binaryOperator.getPosition());
return new NumberAdditionOperation((Returnable<Number>) left, (Returnable<Number>) right, binaryOperator.getPosition());
}
return new ConcatenationOperation((Returnable<Object>) left, (Returnable<Object>) right, binaryOperator.getPosition());
case BOOLEAN_OPERATOR:
default:
throw new UnsupportedOperationException("Unsupported binary operator: " + binaryOperator.getType());
}
}
private Block parseBlock(List<Token> tokens) throws ParseException {

View File

@@ -0,0 +1,14 @@
package com.dfsek.terra.api.structures.parser.lang.constants;
import com.dfsek.terra.api.structures.tokenizer.Position;
public class BooleanConstant extends ConstantExpression<Boolean> {
public BooleanConstant(Boolean constant, Position position) {
super(constant, position);
}
@Override
public ReturnType returnType() {
return ReturnType.BOOLEAN;
}
}

View File

@@ -1,10 +1,11 @@
package com.dfsek.terra.api.structures.parser.lang;
package com.dfsek.terra.api.structures.parser.lang.constants;
import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.structures.parser.lang.Returnable;
import com.dfsek.terra.api.structures.tokenizer.Position;
public class ConstantExpression<T> implements Returnable<T> {
public abstract class ConstantExpression<T> implements Returnable<T> {
private final T constant;
private final Position position;
@@ -32,12 +33,4 @@ public class ConstantExpression<T> implements Returnable<T> {
public T getConstant() {
return constant;
}
@Override
public ReturnType returnType() {
if(constant instanceof String) return ReturnType.STRING;
if(constant instanceof Number) return ReturnType.NUMBER;
if(constant instanceof Boolean) return ReturnType.BOOLEAN;
return ReturnType.OBJECT;
}
}

View File

@@ -0,0 +1,14 @@
package com.dfsek.terra.api.structures.parser.lang.constants;
import com.dfsek.terra.api.structures.tokenizer.Position;
public class NumericConstant extends ConstantExpression<Number> {
public NumericConstant(Number constant, Position position) {
super(constant, position);
}
@Override
public ReturnType returnType() {
return ReturnType.NUMBER;
}
}

View File

@@ -0,0 +1,14 @@
package com.dfsek.terra.api.structures.parser.lang.constants;
import com.dfsek.terra.api.structures.tokenizer.Position;
public class StringConstant extends ConstantExpression<String> {
public StringConstant(String constant, Position position) {
super(constant, position);
}
@Override
public ReturnType returnType() {
return ReturnType.STRING;
}
}

View File

@@ -20,7 +20,7 @@ public abstract class BinaryOperation<T> implements Returnable<T> {
@Override
public Position getPosition() {
return getPosition();
return start;
}
@Override

View File

@@ -4,7 +4,7 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable;
import com.dfsek.terra.api.structures.tokenizer.Position;
public class ConcatenationOperation extends BinaryOperation<Object> {
protected ConcatenationOperation(Returnable<Object> left, Returnable<Object> right, Position position) {
public ConcatenationOperation(Returnable<Object> left, Returnable<Object> right, Position position) {
super(left, right, position);
}

View File

@@ -4,7 +4,7 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable;
import com.dfsek.terra.api.structures.tokenizer.Position;
public class NumberAdditionOperation extends BinaryOperation<Number> {
protected NumberAdditionOperation(Returnable<Number> left, Returnable<Number> right, Position position) {
public NumberAdditionOperation(Returnable<Number> left, Returnable<Number> right, Position position) {
super(left, right, position);
}

View File

@@ -4,8 +4,8 @@ import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.platform.TerraPlugin;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.structures.parser.lang.ConstantExpression;
import com.dfsek.terra.api.structures.parser.lang.Returnable;
import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression;
import com.dfsek.terra.api.structures.parser.lang.functions.Function;
import com.dfsek.terra.api.structures.tokenizer.Position;

View File

@@ -32,6 +32,14 @@ public class Token {
return this.type.equals(Type.NUMBER) || this.type.equals(Type.STRING) || this.type.equals(Type.BOOLEAN);
}
public boolean isBinaryOperator() {
return type.equals(Type.ADDITION_OPERATOR)
|| type.equals(Type.SUBTRACTION_OPERATOR)
|| type.equals(Type.MULTIPLICATION_OPERATOR)
|| type.equals(Type.DIVISION_OPERATOR)
|| type.equals(Type.BOOLEAN_OPERATOR);
}
public enum Type {
/**
* Function identifier or language keyword

View File

@@ -1,5 +1,5 @@
test("hello", 2);
test("hello" + 3 + "gdfg", 2 + 1.2);
if("true") {
test("fdsgdf", 3.4);
if(true) {
test("fdsgdf" + 2, 3.4);
}