Skip to content

Commit

Permalink
[interval] Implements 'in' operator
Browse files Browse the repository at this point in the history
  • Loading branch information
Hazurl authored and 5pilow committed Jul 21, 2023
1 parent e83de49 commit 4c0793d
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 10 deletions.
2 changes: 2 additions & 0 deletions src/main/java/leekscript/compiler/LexicalParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,8 @@ private boolean tryParseIdentifier() {
addToken("instanceof", TokenType.OPERATOR);
} else if (wordEquals(word, "as")) {
addToken("as", TokenType.OPERATOR);
} else if (wordEquals(word, "in")) {
addToken("in", TokenType.OPERATOR);
} else {
addToken(word, TokenType.STRING);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -877,6 +877,13 @@ public void writeJavaCode(MainLeekBlock mainblock, JavaWriter writer) {
}
mExpression1.writeJavaCode(mainblock, writer);
return;
case Operators.IN:
// In LS, the expression is `expr in interval`, in Java, it's `interval.contains(expr)`
mExpression2.writeJavaCode(mainblock, writer);
writer.addCode(".contains(");
mExpression1.writeJavaCode(mainblock, writer);
writer.addCode(")");
return;
case Operators.NON_NULL_ASSERTION:
writer.compileConvert(mainblock, 0, mExpression2, type);
return;
Expand Down Expand Up @@ -1081,7 +1088,7 @@ public void analyze(WordCompiler compiler) throws LeekCompilerException {
type = mExpression1.getType().mul(mExpression2.getType());
} else if (mOperator == Operators.POWERASSIGN) {
type = mExpression1.getType().pow(mExpression2.getType());
} else if (mOperator == Operators.NOT || mOperator == Operators.EQUALS_EQUALS || mOperator == Operators.LESS || mOperator == Operators.MORE || mOperator == Operators.MOREEQUALS || mOperator == Operators.LESSEQUALS || mOperator == Operators.EQUALS || mOperator == Operators.AND || mOperator == Operators.OR || mOperator == Operators.NOTEQUALS || mOperator == Operators.NOT_EQUALS_EQUALS || mOperator == Operators.INSTANCEOF) {
} else if (mOperator == Operators.NOT || mOperator == Operators.EQUALS_EQUALS || mOperator == Operators.LESS || mOperator == Operators.MORE || mOperator == Operators.MOREEQUALS || mOperator == Operators.LESSEQUALS || mOperator == Operators.EQUALS || mOperator == Operators.AND || mOperator == Operators.OR || mOperator == Operators.NOTEQUALS || mOperator == Operators.NOT_EQUALS_EQUALS || mOperator == Operators.INSTANCEOF || mOperator == Operators.IN) {
type = Type.BOOL;
}
else if (mOperator == Operators.BITAND || mOperator == Operators.BITNOT || mOperator == Operators.BITOR || mOperator == Operators.BITXOR || mOperator == Operators.SHIFT_LEFT || mOperator == Operators.SHIFT_RIGHT || mOperator == Operators.SHIFT_UNSIGNED_RIGHT || mOperator == Operators.INTEGER_DIVISION) {
Expand Down
11 changes: 9 additions & 2 deletions src/main/java/leekscript/compiler/expression/Operators.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ public class Operators {
public final static int INTEGER_DIVISION = 51;
public final static int INTEGER_DIVISION_EQ = 52;
public final static int AS = 53;
public final static int NON_NULL_ASSERTION = 54;
public final static int NON_NULL_ASSERTION = 54;
public final static int IN = 55;


public final static int getOperator(String operator, int version) {
if(operator.equals("[")) return CROCHET;
Expand Down Expand Up @@ -113,7 +115,9 @@ public final static int getOperator(String operator, int version) {
if(operator.equals("instanceof")) return INSTANCEOF;
if(operator.equals("\\")) return INTEGER_DIVISION;
if(operator.equals("\\=")) return INTEGER_DIVISION_EQ;
if(operator.equals("as")) return AS;
if(operator.equals("as")) return AS;
if(operator.equals("in")) return IN;

return -1;
}

Expand Down Expand Up @@ -155,6 +159,7 @@ public static int getPriority(int operator) {
case MORE:
case MOREEQUALS:
case INSTANCEOF:
case IN:
return 8;
case EQUALS:
case NOTEQUALS:
Expand Down Expand Up @@ -316,6 +321,8 @@ public static String getString(int operator) {
return "instanceof";
case AS:
return "as";
case IN:
return "in";
}
return "null";
}
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/leekscript/runner/values/IntervalLeekValue.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,9 @@ public String toString(AI ai, Set<Object> visited) throws LeekRunException {

return sb.append("]").toString();
}

public boolean contains(Object value) throws LeekRunException {
ai.ops(1);
return ai.lessequals(from, value) && ai.lessequals(value, to);
}
}
4 changes: 2 additions & 2 deletions src/test/java/test/TestGeneral.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public void run() {
code_v1("var " + word + " = 2;").error(Error.NONE);
code_v2("var " + word + " = 2;").error(Error.THIS_NOT_ALLOWED_HERE);
code_v3_("var " + word + " = 2;").error(Error.VARIABLE_NAME_UNAVAILABLE);
} else if (word.equals("instanceof") || word.equals("as")) {
} else if (word.equals("instanceof") || word.equals("as") || word.equals("in")) {
code_v1_2("var " + word + " = 2;").error(Error.VAR_NAME_EXPECTED);
code_v3_("var " + word + " = 2;").error(Error.VAR_NAME_EXPECTED);
} else if (word.equals("function")) {
Expand All @@ -99,7 +99,7 @@ public void run() {
for (var word : LexicalParser.reservedWords) {
if (word.equals("this")) {
code_v3_("global " + word + " = 2;").error(Error.VARIABLE_NAME_UNAVAILABLE);
} else if (word.equals("instanceof") || word.equals("as") || word.equals("void")) {
} else if (word.equals("instanceof") || word.equals("as") || word.equals("void") || word.equals("in")) {
code_v3_("global " + word + " = 2;").error(Error.VAR_NAME_EXPECTED_AFTER_GLOBAL);
} else if (word.equals("function")) {
code_v3_("global " + word + " = 2;").error(Error.VARIABLE_NAME_UNAVAILABLE);
Expand Down
18 changes: 13 additions & 5 deletions src/test/java/test/TestInterval.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
package test;

import leekscript.common.Error;

public class TestInterval extends TestCommon {

public void run() throws Exception {

section("Interval.constructor()");
code_v4_("return [1..2];").debug().equals("[1..2]");
code_v4_("return [-10..-2];").debug().equals("[-10..-2]");
code_v4_("return [1 * 5 .. 8 + 5];").debug().equals("[5..13]");
code_v4_("return [1..2];").equals("[1..2]");
code_v4_("return [-10..-2];").equals("[-10..-2]");
code_v4_("return [1 * 5 .. 8 + 5];").equals("[5..13]");

section("Interval.in");
code_v4_("return 1 in [1..2];").equals("true");
code_v4_("return 1 in [0..2];").equals("true");
code_v4_("return 2 in [1..2];").equals("true");
code_v4_("return 3 in [1..2];").equals("false");
code_v4_("return 0 in [1..2];").equals("false");
code_v4_("return 1 in [1..1];").equals("true");
code_v4_("return 1 in [2..1];").equals("false");
code_strict_v4_("boolean x = 1 in [1..1]; return x").equals("true");
}
}

0 comments on commit 4c0793d

Please sign in to comment.