Skip to content

Commit

Permalink
Add more binary expressions
Browse files Browse the repository at this point in the history
  • Loading branch information
TenFont committed Sep 9, 2023
1 parent e2dde43 commit fe44b8c
Show file tree
Hide file tree
Showing 7 changed files with 145 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.jetbrains.annotations.Nullable;

public class AdditiveExpression extends BinaryExpression {
private char operator;
private Expression right;

public AdditiveExpression(Expression left) {
Expand All @@ -19,14 +20,22 @@ public AdditiveExpression(Expression left) {
public @Nullable Object get(Context context) {
Object leftValue = getLeft().get(context);
Object rightValue = right.get(context);
if (leftValue instanceof String || rightValue instanceof String)
return TypeUtils.toString(leftValue) + TypeUtils.toString(rightValue);
return TypeUtils.toDouble(leftValue) + TypeUtils.toDouble(rightValue);
switch (operator) {
case '+' -> {
if (leftValue instanceof String || rightValue instanceof String)
return TypeUtils.toString(leftValue) + TypeUtils.toString(rightValue);
return TypeUtils.toDouble(leftValue) + TypeUtils.toDouble(rightValue);
}
case '-' -> {
return TypeUtils.toDouble(leftValue) - TypeUtils.toDouble(rightValue);
}
default -> throw new IllegalArgumentException();
}
}

@Override
public boolean init(Parser parser, Context context) {
parser.eat(TokenType.ADDITIVE_OPERATOR);
operator = parser.eat(TokenType.ADDITIVE_OPERATOR, Character.class);
right = parser.parseExpression(context);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package dev.tenfont.cpmm.elements.expressions.binaryexpressions;

import dev.tenfont.cpmm.lang.Parser;
import dev.tenfont.cpmm.lang.components.BinaryExpression;
import dev.tenfont.cpmm.lang.components.Context;
import dev.tenfont.cpmm.lang.components.Expression;
import dev.tenfont.cpmm.lang.components.TokenType;

public class EqualityExpression extends BinaryExpression {
private Expression right;

public EqualityExpression(Expression left) {
super(left);
}

@Override
public Object get(Context context) {
return getLeft().get(context).equals(right.get(context));
}

@Override
public boolean init(Parser parser, Context context) {
parser.eat(TokenType.EQUALITY_OPERATOR);
right = parser.parseExpression(context);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package dev.tenfont.cpmm.elements.expressions.binaryexpressions;

import dev.tenfont.cpmm.lang.Parser;
import dev.tenfont.cpmm.lang.components.BinaryExpression;
import dev.tenfont.cpmm.lang.components.Context;
import dev.tenfont.cpmm.lang.components.Expression;
import dev.tenfont.cpmm.lang.components.TokenType;
import dev.tenfont.cpmm.util.TypeUtils;

public class MultiplicativeExpression extends BinaryExpression {
private char operator;
private Expression right;

public MultiplicativeExpression(Expression left) {
super(left);
}

@Override
public Object get(Context context) {
Object leftValue = getLeft().get(context);
Object rightValue = right.get(context);
switch (operator) {
case '*' -> {
if (leftValue instanceof String) {
return ((String) leftValue).repeat((int) TypeUtils.toDouble(rightValue));
} else if (rightValue instanceof String) {
return ((String) rightValue).repeat((int) TypeUtils.toDouble(leftValue));
}
return TypeUtils.toDouble(leftValue) * TypeUtils.toDouble(rightValue);
}
case '/' -> {
return TypeUtils.toDouble(leftValue) / TypeUtils.toDouble(rightValue);
}
default -> throw new IllegalArgumentException();
}
}

@Override
public boolean init(Parser parser, Context context) {
operator = parser.eat(TokenType.MULTIPLICATIVE_OPERATOR, Character.class);
right = parser.parseExpression(context);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package dev.tenfont.cpmm.elements.expressions.binaryexpressions;

import dev.tenfont.cpmm.lang.Parser;
import dev.tenfont.cpmm.lang.components.BinaryExpression;
import dev.tenfont.cpmm.lang.components.Context;
import dev.tenfont.cpmm.lang.components.Expression;
import dev.tenfont.cpmm.lang.components.TokenType;
import dev.tenfont.cpmm.util.TypeUtils;

public class RelationalExpression extends BinaryExpression {
private String operator;
private Expression right;

public RelationalExpression(Expression left) {
super(left);
}

@Override
public Object get(Context context) {
double leftValue = TypeUtils.toDouble(getLeft().get(context));
double rightValue = TypeUtils.toDouble(right.get(context));
return switch (operator) {
case ">" -> leftValue > rightValue;
case ">=" -> leftValue >= rightValue;
case "<" -> leftValue < rightValue;
case "<=" -> leftValue <= rightValue;
default -> throw new IllegalArgumentException();
};
}

@Override
public boolean init(Parser parser, Context context) {
operator = parser.eat(TokenType.RELATIONAL_OPERATOR, String.class);
right = parser.parseExpression(context);
return true;
}
}
6 changes: 4 additions & 2 deletions src/main/java/dev/tenfont/cpmm/lang/Parser.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package dev.tenfont.cpmm.lang;

import dev.tenfont.cpmm.elements.expressions.binaryexpressions.AdditiveExpression;
import dev.tenfont.cpmm.elements.expressions.binaryexpressions.AssigmentExpression;
import dev.tenfont.cpmm.elements.expressions.binaryexpressions.*;
import dev.tenfont.cpmm.elements.expressions.literals.BooleanLiteralExpression;
import dev.tenfont.cpmm.elements.expressions.literals.IdentifierExpression;
import dev.tenfont.cpmm.elements.expressions.literals.NumberLiteralExpression;
Expand Down Expand Up @@ -83,7 +82,10 @@ public Expression parseBinaryExpression(Context context) {
Expression expression;
switch (lookAhead.type()) {
case ASSIGNMENT_OPERATOR -> expression = new AssigmentExpression(left);
case EQUALITY_OPERATOR -> expression = new EqualityExpression(left);
case RELATIONAL_OPERATOR -> expression = new RelationalExpression(left);
case ADDITIVE_OPERATOR -> expression = new AdditiveExpression(left);
case MULTIPLICATIVE_OPERATOR -> expression = new MultiplicativeExpression(left);
default -> {
return left;
}
Expand Down
12 changes: 10 additions & 2 deletions src/main/java/dev/tenfont/cpmm/lang/components/TokenType.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,22 +85,30 @@ public enum TokenType {
REVERSE(true, "reverse"),

// OPERATORS
ASSIGNMENT_OPERATOR(true, '='),
ADDITIVE_OPERATOR(true, reader -> {
char operator = reader.readChar();
return switch (operator) {
case '+', '-' -> operator;
default -> null;
};
}),
COMPARISON_OPERATOR(true, reader -> {
MULTIPLICATIVE_OPERATOR(true, reader -> {
char operator = reader.readChar();
return switch (operator) {
case '*', '/' -> operator;
default -> null;
};
}),
RELATIONAL_OPERATOR(true, reader -> {
char operator = reader.readChar();
if (operator != '>' && operator != '<') return null;
if (reader.canRead(1) && reader.peekChar() == '=') {
return operator + reader.readChar();
}
return String.valueOf(operator);
}),
EQUALITY_OPERATOR(true, "=="),
ASSIGNMENT_OPERATOR(true, '='),

// FUNCTION
FUNCTION(true, reader -> {
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/dev/tenfont/cpmm/util/TypeUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public static String toString(Object object) {
return String.valueOf(object);
}

public static Double toDouble(Object object) {
public static double toDouble(Object object) {
if (object instanceof Double)
return (Double) object;
else if (object instanceof String)
Expand All @@ -26,4 +26,13 @@ else if (object instanceof Boolean)
return ((boolean) object) ? 1d : 0d;
return 0d;
}

public static boolean toBoolean(Object object) {
if (object instanceof Boolean)
return (Boolean) object;
else if (object instanceof Double)
return (double) object != 0;
else
return false;
}
}

0 comments on commit fe44b8c

Please sign in to comment.