mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-02-16 10:30:42 +00:00
binary operations work now
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,7 @@ public abstract class BinaryOperation<T> implements Returnable<T> {
|
||||
|
||||
@Override
|
||||
public Position getPosition() {
|
||||
return getPosition();
|
||||
return start;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user