use of stanhebben.zenscript.parser.Token in project ZenScript by CraftTweaker.
the class Statement method read.
public static Statement read(ZenTokener parser, IEnvironmentGlobal environment, ZenType returnType) {
Token next = parser.peek();
switch(next.getType()) {
case T_AOPEN:
{
Token t = parser.next();
ArrayList<Statement> statements = new ArrayList<>();
while (parser.optional(T_ACLOSE) == null) {
statements.add(read(parser, environment, returnType));
}
return new StatementBlock(t.getPosition(), statements);
}
case T_RETURN:
{
parser.next();
ParsedExpression expression = null;
if (parser.peek() != null && !parser.isNext(T_SEMICOLON)) {
expression = ParsedExpression.read(parser, environment);
}
parser.required(T_SEMICOLON, "; expected");
return new StatementReturn(next.getPosition(), returnType, expression);
}
case T_VAR:
case T_VAL:
{
Token start = parser.next();
String name = parser.required(T_ID, "identifier expected").getValue();
ZenType type = null;
ParsedExpression initializer = null;
if (parser.optional(T_AS) != null) {
type = ZenType.read(parser, environment);
}
if (parser.optional(T_ASSIGN) != null) {
initializer = ParsedExpression.read(parser, environment);
}
parser.required(T_SEMICOLON, "; expected");
return new StatementVar(start.getPosition(), name, type, initializer, start.getType() == T_VAL);
}
case T_IF:
{
Token t = parser.next();
ParsedExpression expression = ParsedExpression.read(parser, environment);
Statement onIf = read(parser, environment, returnType);
Statement onElse = null;
if (parser.optional(T_ELSE) != null) {
onElse = read(parser, environment, returnType);
}
return new StatementIf(t.getPosition(), expression, onIf, onElse);
}
case T_FOR:
{
Token t = parser.next();
String name = parser.required(T_ID, "identifier expected").getValue();
List<String> names = new ArrayList<>();
names.add(name);
while (parser.optional(T_COMMA) != null) {
names.add(parser.required(T_ID, "identifier expected").getValue());
}
parser.required(T_IN, "in expected");
ParsedExpression source = ParsedExpression.read(parser, environment);
Statement content = read(parser, environment, null);
return new StatementForeach(t.getPosition(), names.toArray(new String[names.size()]), source, content);
}
case T_WHILE:
{
parser.next();
ParsedExpression condition = ParsedExpression.read(parser, environment);
Statement content = read(parser, environment, null);
return new StatementWhileDo(next.getPosition(), content, condition);
}
case T_VERSION:
{
Token t = parser.next();
parser.required(T_INTVALUE, "integer expected");
parser.required(T_SEMICOLON, "; expected");
return new StatementNull(t.getPosition());
}
case T_BREAK:
{
parser.next();
parser.required(T_SEMICOLON, "; expected");
return new StatementBreak(next.getPosition());
}
}
ZenPosition position = parser.peek().getPosition();
StatementExpression result = new StatementExpression(position, ParsedExpression.read(parser, environment));
parser.required(T_SEMICOLON, "; expected");
return result;
}
use of stanhebben.zenscript.parser.Token in project ZenScript by CraftTweaker.
the class ParsedFunction method parse.
public static ParsedFunction parse(ZenTokener parser, IEnvironmentGlobal environment) {
parser.next();
Token tName = parser.required(ZenTokener.T_ID, "identifier expected");
// function (argname [as type], argname [as type], ...) [as type] {
// ...contents... }
parser.required(T_BROPEN, "( expected");
List<ParsedFunctionArgument> arguments = new ArrayList<>();
if (parser.optional(T_BRCLOSE) == null) {
Token argName = parser.required(T_ID, "identifier expected");
ZenType type = ZenTypeAny.INSTANCE;
if (parser.optional(T_AS) != null) {
type = ZenType.read(parser, environment);
}
arguments.add(new ParsedFunctionArgument(argName.getValue(), type));
while (parser.optional(T_COMMA) != null) {
Token argName2 = parser.required(T_ID, "identifier expected");
ZenType type2 = ZenTypeAny.INSTANCE;
if (parser.optional(T_AS) != null) {
type2 = ZenType.read(parser, environment);
}
arguments.add(new ParsedFunctionArgument(argName2.getValue(), type2));
}
parser.required(T_BRCLOSE, ") expected");
}
ZenType type = ZenTypeAny.INSTANCE;
if (parser.optional(T_AS) != null) {
type = ZenType.read(parser, environment);
}
parser.required(T_AOPEN, "{ expected");
Statement[] statements;
if (parser.optional(T_ACLOSE) != null) {
statements = new Statement[0];
} else {
ArrayList<Statement> statementsAL = new ArrayList<>();
while (parser.optional(T_ACLOSE) == null) {
statementsAL.add(Statement.read(parser, environment, type));
}
statements = statementsAL.toArray(new Statement[statementsAL.size()]);
}
return new ParsedFunction(tName.getPosition(), tName.getValue(), arguments, type, statements);
}
use of stanhebben.zenscript.parser.Token in project ZenScript by CraftTweaker.
the class ParsedGlobalValue method parse.
public static ParsedGlobalValue parse(ZenTokener parser, IEnvironmentGlobal environment, String owner, boolean global) {
// Start ("GLOBAL")
Token startingPoint = parser.next();
// Name ("globalName", "test")
String name = parser.required(T_ID, "Global value requires a name!").getValue();
// Type ("as type", "as IItemStack")
ZenType type = ZenType.ANY;
Token nee = parser.optional(T_AS);
if (nee != null) {
type = ZenType.read(parser, environment);
}
// "="
parser.required(T_ASSIGN, "Global values have to be initialized!");
// "value, <minecraft:dirt>"
ParsedExpression value = ParsedExpression.read(parser, environment);
// ";"
parser.required(T_SEMICOLON, "; expected");
// throw it together
return new ParsedGlobalValue(startingPoint.getPosition(), name, type, value, owner, global);
}
use of stanhebben.zenscript.parser.Token in project CraftTweaker by CraftTweaker.
the class BracketHandlerEntity method find.
private IZenSymbol find(IEnvironmentGlobal environment, List<Token> tokens, int startIndex, int endIndex) {
StringBuilder valueBuilder = new StringBuilder();
for (int i = startIndex; i < endIndex; i++) {
Token token = tokens.get(i);
valueBuilder.append(token.getValue());
}
return position -> new ExpressionCallStatic(position, environment, method, new ExpressionString(position, valueBuilder.toString()));
}
use of stanhebben.zenscript.parser.Token in project CraftTweaker by CraftTweaker.
the class BracketHandlerLiquid method find.
private IZenSymbol find(IEnvironmentGlobal environment, List<Token> tokens, int startIndex, int endIndex) {
StringBuilder valueBuilder = new StringBuilder();
for (int i = startIndex; i < endIndex; i++) {
Token token = tokens.get(i);
valueBuilder.append(token.getValue());
}
Fluid fluid = fluidNames.get(valueBuilder.toString());
if (fluid != null) {
return position -> new ExpressionCallStatic(position, environment, method, new ExpressionString(position, valueBuilder.toString()));
}
return null;
}
Aggregations