Search in sources :

Example 1 with ZenPosition

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;
}
Also used : Token(stanhebben.zenscript.parser.Token) ParsedExpression(stanhebben.zenscript.parser.expression.ParsedExpression) ZenPosition(stanhebben.zenscript.util.ZenPosition) ZenType(stanhebben.zenscript.type.ZenType)

Example 2 with ZenPosition

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;
}
Also used : ZenPosition(stanhebben.zenscript.util.ZenPosition)

Example 3 with ZenPosition

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();
    }
}
Also used : ZenPosition(stanhebben.zenscript.util.ZenPosition)

Aggregations

ZenPosition (stanhebben.zenscript.util.ZenPosition)3 Token (stanhebben.zenscript.parser.Token)1 ParsedExpression (stanhebben.zenscript.parser.expression.ParsedExpression)1 ZenType (stanhebben.zenscript.type.ZenType)1