private List<VariableDeclNode> VariableSpec() throws SyntaxException {
        try {
            List<VariableDeclNode> nodes = new LinkedList<VariableDeclNode>();

            Position declPos = iterator.current().coordinates().starting();
            String name = Identifier();
            BaseTypeNode type;

            if (iterator.current().type().is(Token.Type.ASSIGN)) {
                nextToken();
                ExpressionNode expr = Expression();

                if (iterator.current().type().is(Token.Type.COMMA)) {
                    nextToken();
                    nodes.addAll(VariableSpec());

                    type = ((VariableDeclNode)nodes.get(nodes.size() - 1)).type;
                } else if (iterator.current().type().is(Token.Type.COLON)) {
                    nextToken();
                    type = Type();
                } else {
                    throw new InvalidTokenException(
                            iterator.current(),
                            new Token.Type[] {
                                Token.Type.COLON,
                                Token.Type.COMMA
                            }
                        )
                        .initPosition(iterator.current().coordinates().starting())
                        .Log("ru.bmstu.iu9.compiler.syntax");
                }
                nodes.add(0, new VariableDeclNode(name, type, declPos, expr));
            } else if (iterator.current().type().is(Token.Type.COMMA)) {
                nextToken();
                nodes.addAll(VariableSpec());
                type = ((VariableDeclNode)nodes.get(nodes.size() - 1)).type;

                nodes.add(0, new VariableDeclNode(name, type, declPos));
            } else if (iterator.current().type().is(Token.Type.COLON)){
                nextToken();
                type = Type();
                return Arrays.asList(new VariableDeclNode(name, type, declPos));
            }

            return nodes;
        } catch(SyntaxException ex) {
            throw ex;
        } catch(Exception ex) {
            throw (NonAnalysisException)new NonAnalysisException(ex)
                    .initPosition(iterator.current().coordinates().starting())
                    .Log("ru.bmstu.iu9.compiler.syntax");
        }
    }