module OracleSqlParser::Grammar::Expression

grammar Function
  rule function_expression
    function_name space? '(' space? function_args:function_args? space? ')' {
      def ast
        OracleSqlParser::Ast::FunctionExpression[
          :name => function_name.ast,
          :args => function_args.ast
        ]
      end
    }
  end

  rule function_name
    (
      package_name '.' procedure_name /
      procedure_name
    ) {
      def ast
        OracleSqlParser::Ast::Identifier[:name => text_value]
      end
    }
  end

  rule function_args
    function_arg more:(space? ',' space? function_arg)* {
      def ast
        OracleSqlParser::Ast::Array[function_arg.ast, *more_function_args.map(&:ast)]
      end

      def more_function_args
        more.elements.map(&:function_arg)
      end
    }
  end

  rule function_arg
    expr {
      def ast
        super
      end
    }
  end
end

end