private List<BExpression> parseFileHelper(final InputStream is, Map<String, String> keyValues) throws Exception {
        br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
        readerDone = false;
        final List<BExpression> result = new ArrayList<>();

        // if injected keyValues are present, create assign expressions for them
        if (keyValues != null) {
            for (String key : keyValues.keySet()) {
                final String value = keyValues.get(key);
                result.add(BExpression.createAssignExpressionFromKeyValue(this, key, value));
            }
        }

        for (; ; ) {
            final BExpression exp = BExpression.parse(this, 0);
            if (exp == null) {
                break;
            }
            result.add(exp);
        }
        br.close();
        br = null;
        return result;
    }
add a new lookup-value for the given name to the given lookupData array.
If no array is given (null value passed), the value is added to
the context-binded array. In that case, unknown names and values are
created dynamically.

@return a newly created value element, if any, to optionally add aliases
main/src/main/java/cgeo/geocaching/brouter/expressions/BExpressionContext.java