private static String Asign(Environment e) throws Exception {
        e.SkipEmpty();
        if (e.EOL()) {
            return null;
        }

        e.Check(Character.isLetter(e.Peek()), "Expected 'Name' construct");
        String varName = Name(e);

        ArrayList<String> paramNames = null;
        if (e.Peek() == '(') {
            e.Advance();
            e.SkipEmpty();

            paramNames = new ArrayList<String>();
            while (e.Peek() != ')') {
                paramNames.add(Name(e));

                e.SkipEmpty();
                if (e.Peek() != ')') {
                    e.Check(",", "Missing parameter delimiter ,");
                    e.SkipEmpty();
                    e.Check(e.Peek() != ')', "Empty parameternames are not allowed");
                    e.SkipEmpty();
                }
            }
            e.Check(")", "Function definition is missing closure character )");
        }

        e.SkipEmpty();
        e.Check(":=", "Missing asignment :=");

        if (paramNames != null) {
            e.funcs.put(varName, new Function(paramNames, e.ReadToEnd()));
            return null;

        } else if (Character.isLetter(e.Peek())) {
            e.vars.put(varName, Asign(e));
            return null;

        } else {
            e.SkipEmpty();
            String varValue = ExpressionList(e);

            e.SkipEmpty();
            e.Check(e.EOL(), "Expected end of line.");


            e.vars.put(varName, varValue);
            return varValue;
        }

    }