use of stanhebben.zenscript.util.ZenPosition 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.util.ZenPosition in project ZenScript by CraftTweaker.
the class ParsedExpression method readAssignExpression.
private static ParsedExpression readAssignExpression(ZenTokener parser, IEnvironmentGlobal environment) {
Token token = parser.peek();
if (token == null) {
ZenPosition position = new ZenPosition(parser.getFile(), parser.getLine(), parser.getLineOffset(), parser.getFile().getFileName());
environment.error(position, "unexpected end of file; expression expected");
return new ParsedExpressionInvalid(position);
}
ZenPosition position = token.getPosition();
ParsedExpression left = readConditionalExpression(position, parser, environment);
if (parser.peek() == null) {
ZenPosition position2 = new ZenPosition(parser.getFile(), parser.getLine(), parser.getLineOffset(), parser.getFile().getFileName());
environment.error(position2, "unexpected end of file - ; expected");
return new ParsedExpressionInvalid(position2);
}
switch(parser.peek().getType()) {
case T_ASSIGN:
parser.next();
return new ParsedExpressionAssign(position, left, readAssignExpression(parser, environment));
case T_PLUSASSIGN:
parser.next();
return new ParsedExpressionOpAssign(position, left, readAssignExpression(parser, environment), OperatorType.ADD);
case T_MINUSASSIGN:
parser.next();
return new ParsedExpressionOpAssign(position, left, readAssignExpression(parser, environment), OperatorType.SUB);
case T_TILDEASSIGN:
parser.next();
return new ParsedExpressionOpAssign(position, left, readAssignExpression(parser, environment), OperatorType.CAT);
case T_MULASSIGN:
parser.next();
return new ParsedExpressionOpAssign(position, left, readAssignExpression(parser, environment), OperatorType.MUL);
case T_DIVASSIGN:
parser.next();
return new ParsedExpressionOpAssign(position, left, readAssignExpression(parser, environment), OperatorType.DIV);
case T_MODASSIGN:
parser.next();
return new ParsedExpressionOpAssign(position, left, readAssignExpression(parser, environment), OperatorType.MOD);
case T_ORASSIGN:
parser.next();
return new ParsedExpressionOpAssign(position, left, readAssignExpression(parser, environment), OperatorType.OR);
case T_ANDASSIGN:
parser.next();
return new ParsedExpressionOpAssign(position, left, readAssignExpression(parser, environment), OperatorType.AND);
case T_XORASSIGN:
parser.next();
return new ParsedExpressionOpAssign(position, left, readAssignExpression(parser, environment), OperatorType.XOR);
}
return left;
}
use of stanhebben.zenscript.util.ZenPosition in project ZenScript by CraftTweaker.
the class TokenStream method advanceToken.
/**
* Advances to the next token.
*/
private void advanceToken() {
if (nextChar < 0) {
next = null;
return;
}
try {
int state = 0;
StringBuilder value = new StringBuilder();
int tLine = line;
int tLineOffset = lineOffset;
int _fakeNextChar = nextChar > 127 ? NFA.UNICODE_ESCAPE : nextChar;
while (dfa.transitions[state].containsKey(_fakeNextChar)) {
if (nextChar < 0)
value.append((char) nextChar);
else
value.appendCodePoint(nextChar);
state = dfa.transitions[state].get(_fakeNextChar);
line = reader.line;
lineOffset = reader.lineOffset;
nextChar = reader.read();
_fakeNextChar = nextChar > 127 ? NFA.UNICODE_ESCAPE : nextChar;
}
if (line < 0)
throw new IllegalStateException("Line cannot be negative");
if (dfa.finals[state] != CompiledDFA.NOFINAL) {
if (state == 0)
throw new TokenException(file, line, lineOffset, (char) nextChar);
next = process(new Token(value.toString(), dfa.finals[state], new ZenPosition(file, tLine, tLineOffset, fileNameFallback)));
} else {
if (nextChar < 0 && value.length() == 0) {
// happens on comments at the end of files
return;
}
throw new TokenException(file, line, lineOffset, (char) nextChar);
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
Aggregations