use of stanhebben.zenscript.parser.expression.ParsedExpressionVariable in project ZenScript by CraftTweaker.
the class ParsedZenClassMethod method parse.
public static ParsedZenClassMethod parse(ZenTokener parser, EnvironmentScript classEnvironment, String className) {
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;
ParsedExpression expression = null;
boolean hasDefaultArgument = false;
if (parser.optional(T_AS) != null) {
type = ZenType.read(parser, classEnvironment);
}
if (parser.optional(T_ASSIGN) != null) {
expression = ParsedExpression.read(parser, classEnvironment);
if (expression instanceof ParsedExpressionVariable) {
throw new ParseException(parser.getFile(), parser.getLine(), parser.getLineOffset(), "Variables are not allowed in default arguments");
}
hasDefaultArgument = true;
}
arguments.add(new ParsedFunctionArgument(argName.getValue(), type, expression));
while (parser.optional(T_COMMA) != null) {
Token argName2 = parser.required(T_ID, "identifier expected");
ZenType type2 = ZenTypeAny.INSTANCE;
ParsedExpression expression2 = null;
if (parser.optional(T_AS) != null) {
type2 = ZenType.read(parser, classEnvironment);
}
if (parser.optional(T_ASSIGN) != null) {
expression2 = ParsedExpression.read(parser, classEnvironment);
if (expression2 instanceof ParsedExpressionVariable) {
throw new ParseException(parser.getFile(), parser.getLine(), parser.getLineOffset(), "Variables are not allowed in default arguments");
}
hasDefaultArgument = true;
} else if (hasDefaultArgument) {
throw new ParseException(parser.getFile(), parser.getLine(), parser.getLineOffset(), "Parameter " + argName2.getValue() + " requires a default argument");
}
arguments.add(new ParsedFunctionArgument(argName2.getValue(), type2, expression2));
}
parser.required(T_BRCLOSE, ") expected");
}
ZenType type = ZenTypeAny.INSTANCE;
if (parser.optional(T_AS) != null) {
type = ZenType.read(parser, classEnvironment);
}
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, classEnvironment, type));
}
statements = statementsAL.toArray(new Statement[statementsAL.size()]);
}
return new ParsedZenClassMethod(new ParsedFunction(tName.getPosition(), tName.getValue(), arguments, type, statements), className);
}
use of stanhebben.zenscript.parser.expression.ParsedExpressionVariable 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;
ParsedExpression expression = null;
boolean hasDefaultArgument = false;
if (parser.optional(T_AS) != null) {
type = ZenType.read(parser, environment);
}
if (parser.optional(T_ASSIGN) != null) {
expression = ParsedExpression.read(parser, environment);
if (expression instanceof ParsedExpressionVariable) {
throw new ParseException(parser.getFile(), parser.getLine(), parser.getLineOffset(), "Variables are not allowed in default arguments");
}
hasDefaultArgument = true;
}
arguments.add(new ParsedFunctionArgument(argName.getValue(), type, expression));
while (parser.optional(T_COMMA) != null) {
Token argName2 = parser.required(T_ID, "identifier expected");
ZenType type2 = ZenTypeAny.INSTANCE;
ParsedExpression expression2 = null;
if (parser.optional(T_AS) != null) {
type2 = ZenType.read(parser, environment);
}
if (parser.optional(T_ASSIGN) != null) {
expression2 = ParsedExpression.read(parser, environment);
if (expression2 instanceof ParsedExpressionVariable) {
throw new ParseException(parser.getFile(), parser.getLine(), parser.getLineOffset(), "Variables are not allowed in default arguments");
}
hasDefaultArgument = true;
} else if (hasDefaultArgument) {
throw new ParseException(parser.getFile(), parser.getLine(), parser.getLineOffset(), "Parameter " + argName2.getValue() + " requires a default argument");
}
arguments.add(new ParsedFunctionArgument(argName2.getValue(), type2, expression2));
}
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);
}
Aggregations