code: @Nullable
    ExpressionItem readFunctionArgument(@Nonnull final PushbackReader reader, @Nonnull final ExpressionTree tree, @Nonnull final PreprocessorContext context, @Nullable @MustNotContainNull final FilePositionInfo[] callStack, @Nullable final String source) throws IOException {
      boolean working = true;
      ExpressionItem result = null;
      while (working) {
        final ExpressionItem nextItem = nextItem(reader, context);
        if (nextItem == null) {
          throw context.makeException("Non-closed function detected", null);
        } else if (SpecialItem.COMMA == nextItem) {
          result = nextItem;
          working = false;
        } else if (SpecialItem.BRACKET_OPENING == nextItem) {
          final ExpressionTree subExpression = new ExpressionTree(callStack, source);
          if (SpecialItem.BRACKET_CLOSING != readExpression(reader, subExpression, context, true, false)) {
            throw context.makeException("Non-closed bracket inside a function argument detected", null);
          }
          tree.addTree(subExpression);
        } else if (SpecialItem.BRACKET_CLOSING == nextItem) {
          result = nextItem;
          working = false;
        } else if (nextItem.getExpressionItemType() == ExpressionItemType.FUNCTION) {
          final AbstractFunction function = (AbstractFunction) nextItem;
          ExpressionTree functionTree = readFunction(function, reader, context, callStack, source);
          tree.addTree(functionTree);
        } else {
          tree.addItem(nextItem);
        }
      }
      return result;
    }
docs: The auxiliary method allows to read a function argument
  
  @param reader    a reader to be the character source, must not be null
  @param tree      the result tree to be filled by read items, must not be null
  @param context   a preprocessor context
  @param callStack the current file call stack, can be null
  @param source    the current source line, can be null
  @return the last read expression item (a comma or a bracket)
  @throws IOException it will be thrown if there is any error during char reading from the reader