mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Урок 12. Многомерные массивы
This commit is contained in:
parent
c678d5d5e1
commit
5144524ba2
11
program.own
11
program.own
@ -54,7 +54,10 @@ arr = [1, "text", sum(10, 15), [], ["text", [90, [7 + 6, [50]]]]]
|
|||||||
print arr + "\n"
|
print arr + "\n"
|
||||||
arr[0] = arr[0] + 1000 + arr[2]
|
arr[0] = arr[0] + 1000 + arr[2]
|
||||||
print arr + "\n"
|
print arr + "\n"
|
||||||
arr4 = arr[4]
|
print arr[4][1] + "\n"
|
||||||
print arr4 + "\n"
|
arr[4][1] = "text"
|
||||||
arr41 = arr4[1]
|
print arr[4][1] + "\n"
|
||||||
print arr41 + "\n"
|
|
||||||
|
print "\n\n"
|
||||||
|
array = newarray(2, 2, 2, 2)
|
||||||
|
print array
|
@ -31,8 +31,28 @@ public final class Functions {
|
|||||||
}
|
}
|
||||||
return NumberValue.ZERO;
|
return NumberValue.ZERO;
|
||||||
});
|
});
|
||||||
functions.put("newarray", args -> {
|
functions.put("newarray", new Function() {
|
||||||
return new ArrayValue(args);
|
|
||||||
|
@Override
|
||||||
|
public Value execute(Value... args) {
|
||||||
|
return createArray(args, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayValue createArray(Value[] args, int index) {
|
||||||
|
final int size = (int) args[index].asNumber();
|
||||||
|
final int last = args.length - 1;
|
||||||
|
ArrayValue array = new ArrayValue(size);
|
||||||
|
if (index == last) {
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
array.set(i, NumberValue.ZERO);
|
||||||
|
}
|
||||||
|
} else if (index < last) {
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
array.set(i, createArray(args, index + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,12 +86,9 @@ public final class Parser {
|
|||||||
return new AssignmentStatement(variable, expression());
|
return new AssignmentStatement(variable, expression());
|
||||||
}
|
}
|
||||||
if (lookMatch(0, TokenType.WORD) && lookMatch(1, TokenType.LBRACKET)) {
|
if (lookMatch(0, TokenType.WORD) && lookMatch(1, TokenType.LBRACKET)) {
|
||||||
final String variable = consume(TokenType.WORD).getText();
|
final ArrayAccessExpression array = element();
|
||||||
consume(TokenType.LBRACKET);
|
|
||||||
final Expression index = expression();
|
|
||||||
consume(TokenType.RBRACKET);
|
|
||||||
consume(TokenType.EQ);
|
consume(TokenType.EQ);
|
||||||
return new ArrayAssignmentStatement(variable, index, expression());
|
return new ArrayAssignmentStatement(array, expression());
|
||||||
}
|
}
|
||||||
throw new RuntimeException("Unknown statement");
|
throw new RuntimeException("Unknown statement");
|
||||||
}
|
}
|
||||||
@ -164,12 +161,15 @@ public final class Parser {
|
|||||||
return new ArrayExpression(elements);
|
return new ArrayExpression(elements);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Expression element() {
|
private ArrayAccessExpression element() {
|
||||||
final String variable = consume(TokenType.WORD).getText();
|
final String variable = consume(TokenType.WORD).getText();
|
||||||
consume(TokenType.LBRACKET);
|
final List<Expression> indices = new ArrayList<>();
|
||||||
final Expression index = expression();
|
do {
|
||||||
consume(TokenType.RBRACKET);
|
consume(TokenType.LBRACKET);
|
||||||
return new ArrayAccessExpression(variable, index);
|
indices.add(expression());
|
||||||
|
consume(TokenType.RBRACKET);
|
||||||
|
} while(lookMatch(0, TokenType.LBRACKET));
|
||||||
|
return new ArrayAccessExpression(variable, indices);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Expression expression() {
|
private Expression expression() {
|
||||||
|
@ -3,6 +3,7 @@ package com.annimon.ownlang.parser.ast;
|
|||||||
import com.annimon.ownlang.lib.ArrayValue;
|
import com.annimon.ownlang.lib.ArrayValue;
|
||||||
import com.annimon.ownlang.lib.Value;
|
import com.annimon.ownlang.lib.Value;
|
||||||
import com.annimon.ownlang.lib.Variables;
|
import com.annimon.ownlang.lib.Variables;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -11,19 +12,38 @@ import com.annimon.ownlang.lib.Variables;
|
|||||||
public final class ArrayAccessExpression implements Expression {
|
public final class ArrayAccessExpression implements Expression {
|
||||||
|
|
||||||
private final String variable;
|
private final String variable;
|
||||||
private final Expression index;
|
private final List<Expression> indices;
|
||||||
|
|
||||||
public ArrayAccessExpression(String variable, Expression index) {
|
public ArrayAccessExpression(String variable, List<Expression> indices) {
|
||||||
this.variable = variable;
|
this.variable = variable;
|
||||||
this.index = index;
|
this.indices = indices;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Value eval() {
|
public Value eval() {
|
||||||
final Value var = Variables.get(variable);
|
return getArray().get(lastIndex());
|
||||||
if (var instanceof ArrayValue) {
|
}
|
||||||
final ArrayValue array = (ArrayValue) var;
|
|
||||||
return array.get((int) index.eval().asNumber());
|
public ArrayValue getArray() {
|
||||||
|
ArrayValue array = consumeArray(Variables.get(variable));
|
||||||
|
final int last = indices.size() - 1;
|
||||||
|
for (int i = 0; i < last; i++) {
|
||||||
|
array = consumeArray( array.get(index(i)) );
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int lastIndex() {
|
||||||
|
return index(indices.size() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int index(int index) {
|
||||||
|
return (int) indices.get(index).eval().asNumber();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayValue consumeArray(Value value) {
|
||||||
|
if (value instanceof ArrayValue) {
|
||||||
|
return (ArrayValue) value;
|
||||||
} else {
|
} else {
|
||||||
throw new RuntimeException("Array expected");
|
throw new RuntimeException("Array expected");
|
||||||
}
|
}
|
||||||
@ -31,6 +51,6 @@ public final class ArrayAccessExpression implements Expression {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format("%s[%s]", variable, index);
|
return variable + indices;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,38 +1,26 @@
|
|||||||
package com.annimon.ownlang.parser.ast;
|
package com.annimon.ownlang.parser.ast;
|
||||||
|
|
||||||
import com.annimon.ownlang.lib.ArrayValue;
|
|
||||||
import com.annimon.ownlang.lib.Value;
|
|
||||||
import com.annimon.ownlang.lib.Variables;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author aNNiMON
|
* @author aNNiMON
|
||||||
*/
|
*/
|
||||||
public final class ArrayAssignmentStatement implements Statement {
|
public final class ArrayAssignmentStatement implements Statement {
|
||||||
|
|
||||||
private final String variable;
|
private final ArrayAccessExpression array;
|
||||||
private final Expression index;
|
|
||||||
private final Expression expression;
|
private final Expression expression;
|
||||||
|
|
||||||
public ArrayAssignmentStatement(String variable, Expression index, Expression expression) {
|
public ArrayAssignmentStatement(ArrayAccessExpression array, Expression expression) {
|
||||||
this.variable = variable;
|
this.array = array;
|
||||||
this.index = index;
|
|
||||||
this.expression = expression;
|
this.expression = expression;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute() {
|
public void execute() {
|
||||||
final Value var = Variables.get(variable);
|
array.getArray().set(array.lastIndex(), expression.eval());
|
||||||
if (var instanceof ArrayValue) {
|
|
||||||
final ArrayValue array = (ArrayValue) var;
|
|
||||||
array.set((int) index.eval().asNumber(), expression.eval());
|
|
||||||
} else {
|
|
||||||
throw new RuntimeException("Array expected");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format("%s[%s] = %s", variable, index, expression);
|
return String.format("%s = %s", array, expression);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user